feat(persona-kit): translate codex mcpServers into launch args - #85

Merged
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation
May 11, 2026
Merged

feat(persona-kit): translate codex mcpServers into launch args#85
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation

Conversation

@khaliqgant

@khaliqgantkhaliqgant commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

  • wire persona-kit codex harness to translate persona mcpServers into codex --config mcp_servers.... args at launch
  • map stdio servers to command/args/env and remote servers to url/http_headers
  • keep codex permission injection as warning-only (unchanged)
  • add focused tests for codex HTTP + stdio translation and SSE warning behavior
  • update docs/comments that previously said codex MCP was unsupported

Relay alignment

  • mirrors the codex MCP arg pattern already used in relay (repeated --config TOML overrides)
  • keeps output deterministic by sorting server keys and inline-table keys

Validation

  • corepack pnpm --filter @agentworkforce/persona-kit test

@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0ea59fc7-c64a-4dc2-8300-4b5ad1a15f57

📥 Commits

Reviewing files that changed from the base of the PR and between 1a814da and 9bac2c2.

📒 Files selected for processing (2)
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/persona-kit/src/interactive-spec.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/persona-kit/src/interactive-spec.ts

📝 Walkthrough

Walkthrough

This PR extends the persona-kit to wire MCP servers for the Codex harness by translating persona mcpServers into TOML config override arguments. Type documentation, integration logic, unit tests, and CLI README guidance are updated to reflect Codex support alongside existing Claude and Opencode behavior.

Changes

Codex MCP Server Support

Layer / File(s)Summary
Type Documentation
packages/persona-kit/src/types.ts
PersonaSpec.mcpServers JSDoc updated to document behavior across harnesses: Claude via --mcp-config, Codex via --config mcp_servers.<name>..., and Opencode warning-only.
Codex TOML Serialization Helpers
packages/persona-kit/src/interactive-spec.ts
Added internal helpers to serialize TOML basic strings/arrays/inline tables, build --config arguments, and construct mcp_servers.<name> entries from persona mcpServers with support for stdio and sse transports (emitting warnings for sse).
MCP Wiring in buildInteractiveSpec
packages/persona-kit/src/interactive-spec.ts
buildInteractiveSpec JSDoc updated to document Codex MCP support; Codex branch now injects mcpServers into command arguments via TOML config overrides instead of emitting an unsupported warning.
Unit Tests
packages/persona-kit/src/interactive-spec.test.ts
Added tests for HTTP and stdio MCP server translation to Codex config args, TOML key quoting test, updated warning test expectations for unsupported permissions and sse transport hints, and adjusted test inputs in an existing warning assertion.
CLI README
packages/cli/README.md
MCP capability table updated to document Codex support; tier selection guidance revised to recommend Claude or Codex for MCP-using personas; Opencode warning case added to troubleshooting section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • AgentWorkforce/workforce#78: Both PRs modify packages/persona-kit/src/interactive-spec.ts; this PR changes Codex MCP wiring where the other PR added buildNonInteractiveSpec.
  • AgentWorkforce/workforce#73: Related changes to interactive-spec implementation and exports that overlap with this PR's edits.

Poem

🐰 I nibble TOML keys in moonlit code,

Codex now learns the MCP road.
Claude keeps its path, Opencode will warn,
Tests hop along at the break of dawn.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main change: adding codex mcpServers translation into launch arguments, which is the core feature implemented across the changeset.
Description check✅ PassedThe description is clearly related to the changeset, detailing the MCP server translation implementation, mapping logic, test additions, and documentation updates that match the file changes.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/codex-mcpservers-translation

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/persona-kit/src/interactive-spec.ts`:
- Around line 119-120: The dotted-key prefix construction in the loop using
mcpServers and the local variable prefix (mcp_servers.${name}) can produce
invalid TOML keys if name contains dots or other special chars; update the code
in packages/persona-kit/src/interactive-spec.ts to either validate server names
against an allowed charset (e.g., /^[A-Za-z0-9_-]+$/) before using them or
escape/quote the segment when building the dotted key (e.g., produce
mcp_servers."escapedName" by adding a small helper escapeTomlKey(name) that
returns a properly backslash-escaped quoted key, and use that helper when
setting prefix inside the for (const [name, server] ...) loop).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 626e0e00-e681-4d6f-b39d-eb790b754e14

📥 Commits

Reviewing files that changed from the base of the PR and between 7c5549c and 1a814da.

📒 Files selected for processing (4)
  • packages/cli/README.md
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
  • packages/persona-kit/src/types.ts

Comment threadpackages/persona-kit/src/interactive-spec.ts Outdated

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

warnings: string[]
): void {
for (const [name, server] of Object.entries(mcpServers).sort(([a], [b]) => a.localeCompare(b))) {
const prefix = `mcp_servers.${name}`;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MCP server name not quoted in TOML dotted-key path, producing invalid or mis-parsed TOML

In appendCodexMcpServerArgs, the MCP server name is interpolated directly into the TOML key path as a bare key: const prefix = \mcp_servers.${name}`. TOML bare keys only support [A-Za-z0-9_-]. If the server name contains dots (e.g. "foo.bar"), TOML interprets mcp_servers.foo.bar.urlas a 4-level nested path instead of the intendedmcp_servers."foo.bar".url. If the name contains spaces or other special characters, the TOML is syntactically invalid. No upstream validation in parseMcpServers (packages/persona-kit/src/parse.ts:400`) constrains MCP server names to bare-key-safe characters, so any JSON object key flows through unchecked.

Suggested change
constprefix=`mcp_servers.${name}`;
constprefix=`mcp_servers.${toTomlBasicString(name)}`;
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@khaliqgant

Copy link
Copy Markdown
MemberAuthor

Addressed CodeRabbit feedback in commit 9bac2c2.

  • Added TOML-safe key segment handling for codex MCP server names via toTomlDottedKeySegment().
  • This prevents invalid mcp_servers.... paths when a server name contains dots/special chars (now emitted as quoted segments when needed).
  • Added a regression test covering a dotted server name (nango.docs) and asserting mcp_servers."nango.docs".url=...

Validation: corepack pnpm --filter @agentworkforce/persona-kit test (pass).

@khaliqgant
khaliqgant merged commit c17ff02 into mainMay 11, 2026
2 checks passed
@khaliqgant
khaliqgant deleted the feat/codex-mcpservers-translation branch May 11, 2026 18:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@khaliqgant
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(persona-kit): translate codex mcpServers into launch args - #85

Merged
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation
May 11, 2026
Merged

feat(persona-kit): translate codex mcpServers into launch args#85
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation

Conversation

@khaliqgant

@khaliqgantkhaliqgant commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

  • wire persona-kit codex harness to translate persona mcpServers into codex --config mcp_servers.... args at launch
  • map stdio servers to command/args/env and remote servers to url/http_headers
  • keep codex permission injection as warning-only (unchanged)
  • add focused tests for codex HTTP + stdio translation and SSE warning behavior
  • update docs/comments that previously said codex MCP was unsupported

Relay alignment

  • mirrors the codex MCP arg pattern already used in relay (repeated --config TOML overrides)
  • keeps output deterministic by sorting server keys and inline-table keys

Validation

  • corepack pnpm --filter @agentworkforce/persona-kit test

@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0ea59fc7-c64a-4dc2-8300-4b5ad1a15f57

📥 Commits

Reviewing files that changed from the base of the PR and between 1a814da and 9bac2c2.

📒 Files selected for processing (2)
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/persona-kit/src/interactive-spec.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/persona-kit/src/interactive-spec.ts

📝 Walkthrough

Walkthrough

This PR extends the persona-kit to wire MCP servers for the Codex harness by translating persona mcpServers into TOML config override arguments. Type documentation, integration logic, unit tests, and CLI README guidance are updated to reflect Codex support alongside existing Claude and Opencode behavior.

Changes

Codex MCP Server Support

Layer / File(s)Summary
Type Documentation
packages/persona-kit/src/types.ts
PersonaSpec.mcpServers JSDoc updated to document behavior across harnesses: Claude via --mcp-config, Codex via --config mcp_servers.<name>..., and Opencode warning-only.
Codex TOML Serialization Helpers
packages/persona-kit/src/interactive-spec.ts
Added internal helpers to serialize TOML basic strings/arrays/inline tables, build --config arguments, and construct mcp_servers.<name> entries from persona mcpServers with support for stdio and sse transports (emitting warnings for sse).
MCP Wiring in buildInteractiveSpec
packages/persona-kit/src/interactive-spec.ts
buildInteractiveSpec JSDoc updated to document Codex MCP support; Codex branch now injects mcpServers into command arguments via TOML config overrides instead of emitting an unsupported warning.
Unit Tests
packages/persona-kit/src/interactive-spec.test.ts
Added tests for HTTP and stdio MCP server translation to Codex config args, TOML key quoting test, updated warning test expectations for unsupported permissions and sse transport hints, and adjusted test inputs in an existing warning assertion.
CLI README
packages/cli/README.md
MCP capability table updated to document Codex support; tier selection guidance revised to recommend Claude or Codex for MCP-using personas; Opencode warning case added to troubleshooting section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • AgentWorkforce/workforce#78: Both PRs modify packages/persona-kit/src/interactive-spec.ts; this PR changes Codex MCP wiring where the other PR added buildNonInteractiveSpec.
  • AgentWorkforce/workforce#73: Related changes to interactive-spec implementation and exports that overlap with this PR's edits.

Poem

🐰 I nibble TOML keys in moonlit code,

Codex now learns the MCP road.
Claude keeps its path, Opencode will warn,
Tests hop along at the break of dawn.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main change: adding codex mcpServers translation into launch arguments, which is the core feature implemented across the changeset.
Description check✅ PassedThe description is clearly related to the changeset, detailing the MCP server translation implementation, mapping logic, test additions, and documentation updates that match the file changes.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/codex-mcpservers-translation

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/persona-kit/src/interactive-spec.ts`:
- Around line 119-120: The dotted-key prefix construction in the loop using
mcpServers and the local variable prefix (mcp_servers.${name}) can produce
invalid TOML keys if name contains dots or other special chars; update the code
in packages/persona-kit/src/interactive-spec.ts to either validate server names
against an allowed charset (e.g., /^[A-Za-z0-9_-]+$/) before using them or
escape/quote the segment when building the dotted key (e.g., produce
mcp_servers."escapedName" by adding a small helper escapeTomlKey(name) that
returns a properly backslash-escaped quoted key, and use that helper when
setting prefix inside the for (const [name, server] ...) loop).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 626e0e00-e681-4d6f-b39d-eb790b754e14

📥 Commits

Reviewing files that changed from the base of the PR and between 7c5549c and 1a814da.

📒 Files selected for processing (4)
  • packages/cli/README.md
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
  • packages/persona-kit/src/types.ts

Comment threadpackages/persona-kit/src/interactive-spec.ts Outdated

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

warnings: string[]
): void {
for (const [name, server] of Object.entries(mcpServers).sort(([a], [b]) => a.localeCompare(b))) {
const prefix = `mcp_servers.${name}`;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MCP server name not quoted in TOML dotted-key path, producing invalid or mis-parsed TOML

In appendCodexMcpServerArgs, the MCP server name is interpolated directly into the TOML key path as a bare key: const prefix = \mcp_servers.${name}`. TOML bare keys only support [A-Za-z0-9_-]. If the server name contains dots (e.g. "foo.bar"), TOML interprets mcp_servers.foo.bar.urlas a 4-level nested path instead of the intendedmcp_servers."foo.bar".url. If the name contains spaces or other special characters, the TOML is syntactically invalid. No upstream validation in parseMcpServers (packages/persona-kit/src/parse.ts:400`) constrains MCP server names to bare-key-safe characters, so any JSON object key flows through unchecked.

Suggested change
constprefix=`mcp_servers.${name}`;
constprefix=`mcp_servers.${toTomlBasicString(name)}`;
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@khaliqgant

Copy link
Copy Markdown
MemberAuthor

Addressed CodeRabbit feedback in commit 9bac2c2.

  • Added TOML-safe key segment handling for codex MCP server names via toTomlDottedKeySegment().
  • This prevents invalid mcp_servers.... paths when a server name contains dots/special chars (now emitted as quoted segments when needed).
  • Added a regression test covering a dotted server name (nango.docs) and asserting mcp_servers."nango.docs".url=...

Validation: corepack pnpm --filter @agentworkforce/persona-kit test (pass).

@khaliqgant
khaliqgant merged commit c17ff02 into mainMay 11, 2026
2 checks passed
@khaliqgant
khaliqgant deleted the feat/codex-mcpservers-translation branch May 11, 2026 18:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@khaliqgant
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(persona-kit): translate codex mcpServers into launch args - #85

Merged
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation
May 11, 2026
Merged

feat(persona-kit): translate codex mcpServers into launch args#85
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation

Conversation

@khaliqgant

@khaliqgantkhaliqgant commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

  • wire persona-kit codex harness to translate persona mcpServers into codex --config mcp_servers.... args at launch
  • map stdio servers to command/args/env and remote servers to url/http_headers
  • keep codex permission injection as warning-only (unchanged)
  • add focused tests for codex HTTP + stdio translation and SSE warning behavior
  • update docs/comments that previously said codex MCP was unsupported

Relay alignment

  • mirrors the codex MCP arg pattern already used in relay (repeated --config TOML overrides)
  • keeps output deterministic by sorting server keys and inline-table keys

Validation

  • corepack pnpm --filter @agentworkforce/persona-kit test

@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0ea59fc7-c64a-4dc2-8300-4b5ad1a15f57

📥 Commits

Reviewing files that changed from the base of the PR and between 1a814da and 9bac2c2.

📒 Files selected for processing (2)
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/persona-kit/src/interactive-spec.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/persona-kit/src/interactive-spec.ts

📝 Walkthrough

Walkthrough

This PR extends the persona-kit to wire MCP servers for the Codex harness by translating persona mcpServers into TOML config override arguments. Type documentation, integration logic, unit tests, and CLI README guidance are updated to reflect Codex support alongside existing Claude and Opencode behavior.

Changes

Codex MCP Server Support

Layer / File(s)Summary
Type Documentation
packages/persona-kit/src/types.ts
PersonaSpec.mcpServers JSDoc updated to document behavior across harnesses: Claude via --mcp-config, Codex via --config mcp_servers.<name>..., and Opencode warning-only.
Codex TOML Serialization Helpers
packages/persona-kit/src/interactive-spec.ts
Added internal helpers to serialize TOML basic strings/arrays/inline tables, build --config arguments, and construct mcp_servers.<name> entries from persona mcpServers with support for stdio and sse transports (emitting warnings for sse).
MCP Wiring in buildInteractiveSpec
packages/persona-kit/src/interactive-spec.ts
buildInteractiveSpec JSDoc updated to document Codex MCP support; Codex branch now injects mcpServers into command arguments via TOML config overrides instead of emitting an unsupported warning.
Unit Tests
packages/persona-kit/src/interactive-spec.test.ts
Added tests for HTTP and stdio MCP server translation to Codex config args, TOML key quoting test, updated warning test expectations for unsupported permissions and sse transport hints, and adjusted test inputs in an existing warning assertion.
CLI README
packages/cli/README.md
MCP capability table updated to document Codex support; tier selection guidance revised to recommend Claude or Codex for MCP-using personas; Opencode warning case added to troubleshooting section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • AgentWorkforce/workforce#78: Both PRs modify packages/persona-kit/src/interactive-spec.ts; this PR changes Codex MCP wiring where the other PR added buildNonInteractiveSpec.
  • AgentWorkforce/workforce#73: Related changes to interactive-spec implementation and exports that overlap with this PR's edits.

Poem

🐰 I nibble TOML keys in moonlit code,

Codex now learns the MCP road.
Claude keeps its path, Opencode will warn,
Tests hop along at the break of dawn.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main change: adding codex mcpServers translation into launch arguments, which is the core feature implemented across the changeset.
Description check✅ PassedThe description is clearly related to the changeset, detailing the MCP server translation implementation, mapping logic, test additions, and documentation updates that match the file changes.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/codex-mcpservers-translation

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/persona-kit/src/interactive-spec.ts`:
- Around line 119-120: The dotted-key prefix construction in the loop using
mcpServers and the local variable prefix (mcp_servers.${name}) can produce
invalid TOML keys if name contains dots or other special chars; update the code
in packages/persona-kit/src/interactive-spec.ts to either validate server names
against an allowed charset (e.g., /^[A-Za-z0-9_-]+$/) before using them or
escape/quote the segment when building the dotted key (e.g., produce
mcp_servers."escapedName" by adding a small helper escapeTomlKey(name) that
returns a properly backslash-escaped quoted key, and use that helper when
setting prefix inside the for (const [name, server] ...) loop).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 626e0e00-e681-4d6f-b39d-eb790b754e14

📥 Commits

Reviewing files that changed from the base of the PR and between 7c5549c and 1a814da.

📒 Files selected for processing (4)
  • packages/cli/README.md
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
  • packages/persona-kit/src/types.ts

Comment threadpackages/persona-kit/src/interactive-spec.ts Outdated

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

warnings: string[]
): void {
for (const [name, server] of Object.entries(mcpServers).sort(([a], [b]) => a.localeCompare(b))) {
const prefix = `mcp_servers.${name}`;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MCP server name not quoted in TOML dotted-key path, producing invalid or mis-parsed TOML

In appendCodexMcpServerArgs, the MCP server name is interpolated directly into the TOML key path as a bare key: const prefix = \mcp_servers.${name}`. TOML bare keys only support [A-Za-z0-9_-]. If the server name contains dots (e.g. "foo.bar"), TOML interprets mcp_servers.foo.bar.urlas a 4-level nested path instead of the intendedmcp_servers."foo.bar".url. If the name contains spaces or other special characters, the TOML is syntactically invalid. No upstream validation in parseMcpServers (packages/persona-kit/src/parse.ts:400`) constrains MCP server names to bare-key-safe characters, so any JSON object key flows through unchecked.

Suggested change
constprefix=`mcp_servers.${name}`;
constprefix=`mcp_servers.${toTomlBasicString(name)}`;
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@khaliqgant

Copy link
Copy Markdown
MemberAuthor

Addressed CodeRabbit feedback in commit 9bac2c2.

  • Added TOML-safe key segment handling for codex MCP server names via toTomlDottedKeySegment().
  • This prevents invalid mcp_servers.... paths when a server name contains dots/special chars (now emitted as quoted segments when needed).
  • Added a regression test covering a dotted server name (nango.docs) and asserting mcp_servers."nango.docs".url=...

Validation: corepack pnpm --filter @agentworkforce/persona-kit test (pass).

@khaliqgant
khaliqgant merged commit c17ff02 into mainMay 11, 2026
2 checks passed
@khaliqgant
khaliqgant deleted the feat/codex-mcpservers-translation branch May 11, 2026 18:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@khaliqgant
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(persona-kit): translate codex mcpServers into launch args - #85

Merged
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation
May 11, 2026
Merged

feat(persona-kit): translate codex mcpServers into launch args#85
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation

Conversation

@khaliqgant

@khaliqgantkhaliqgant commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

  • wire persona-kit codex harness to translate persona mcpServers into codex --config mcp_servers.... args at launch
  • map stdio servers to command/args/env and remote servers to url/http_headers
  • keep codex permission injection as warning-only (unchanged)
  • add focused tests for codex HTTP + stdio translation and SSE warning behavior
  • update docs/comments that previously said codex MCP was unsupported

Relay alignment

  • mirrors the codex MCP arg pattern already used in relay (repeated --config TOML overrides)
  • keeps output deterministic by sorting server keys and inline-table keys

Validation

  • corepack pnpm --filter @agentworkforce/persona-kit test

@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0ea59fc7-c64a-4dc2-8300-4b5ad1a15f57

📥 Commits

Reviewing files that changed from the base of the PR and between 1a814da and 9bac2c2.

📒 Files selected for processing (2)
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/persona-kit/src/interactive-spec.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/persona-kit/src/interactive-spec.ts

📝 Walkthrough

Walkthrough

This PR extends the persona-kit to wire MCP servers for the Codex harness by translating persona mcpServers into TOML config override arguments. Type documentation, integration logic, unit tests, and CLI README guidance are updated to reflect Codex support alongside existing Claude and Opencode behavior.

Changes

Codex MCP Server Support

Layer / File(s)Summary
Type Documentation
packages/persona-kit/src/types.ts
PersonaSpec.mcpServers JSDoc updated to document behavior across harnesses: Claude via --mcp-config, Codex via --config mcp_servers.<name>..., and Opencode warning-only.
Codex TOML Serialization Helpers
packages/persona-kit/src/interactive-spec.ts
Added internal helpers to serialize TOML basic strings/arrays/inline tables, build --config arguments, and construct mcp_servers.<name> entries from persona mcpServers with support for stdio and sse transports (emitting warnings for sse).
MCP Wiring in buildInteractiveSpec
packages/persona-kit/src/interactive-spec.ts
buildInteractiveSpec JSDoc updated to document Codex MCP support; Codex branch now injects mcpServers into command arguments via TOML config overrides instead of emitting an unsupported warning.
Unit Tests
packages/persona-kit/src/interactive-spec.test.ts
Added tests for HTTP and stdio MCP server translation to Codex config args, TOML key quoting test, updated warning test expectations for unsupported permissions and sse transport hints, and adjusted test inputs in an existing warning assertion.
CLI README
packages/cli/README.md
MCP capability table updated to document Codex support; tier selection guidance revised to recommend Claude or Codex for MCP-using personas; Opencode warning case added to troubleshooting section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • AgentWorkforce/workforce#78: Both PRs modify packages/persona-kit/src/interactive-spec.ts; this PR changes Codex MCP wiring where the other PR added buildNonInteractiveSpec.
  • AgentWorkforce/workforce#73: Related changes to interactive-spec implementation and exports that overlap with this PR's edits.

Poem

🐰 I nibble TOML keys in moonlit code,

Codex now learns the MCP road.
Claude keeps its path, Opencode will warn,
Tests hop along at the break of dawn.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main change: adding codex mcpServers translation into launch arguments, which is the core feature implemented across the changeset.
Description check✅ PassedThe description is clearly related to the changeset, detailing the MCP server translation implementation, mapping logic, test additions, and documentation updates that match the file changes.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/codex-mcpservers-translation

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/persona-kit/src/interactive-spec.ts`:
- Around line 119-120: The dotted-key prefix construction in the loop using
mcpServers and the local variable prefix (mcp_servers.${name}) can produce
invalid TOML keys if name contains dots or other special chars; update the code
in packages/persona-kit/src/interactive-spec.ts to either validate server names
against an allowed charset (e.g., /^[A-Za-z0-9_-]+$/) before using them or
escape/quote the segment when building the dotted key (e.g., produce
mcp_servers."escapedName" by adding a small helper escapeTomlKey(name) that
returns a properly backslash-escaped quoted key, and use that helper when
setting prefix inside the for (const [name, server] ...) loop).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 626e0e00-e681-4d6f-b39d-eb790b754e14

📥 Commits

Reviewing files that changed from the base of the PR and between 7c5549c and 1a814da.

📒 Files selected for processing (4)
  • packages/cli/README.md
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
  • packages/persona-kit/src/types.ts

Comment threadpackages/persona-kit/src/interactive-spec.ts Outdated

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

warnings: string[]
): void {
for (const [name, server] of Object.entries(mcpServers).sort(([a], [b]) => a.localeCompare(b))) {
const prefix = `mcp_servers.${name}`;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MCP server name not quoted in TOML dotted-key path, producing invalid or mis-parsed TOML

In appendCodexMcpServerArgs, the MCP server name is interpolated directly into the TOML key path as a bare key: const prefix = \mcp_servers.${name}`. TOML bare keys only support [A-Za-z0-9_-]. If the server name contains dots (e.g. "foo.bar"), TOML interprets mcp_servers.foo.bar.urlas a 4-level nested path instead of the intendedmcp_servers."foo.bar".url. If the name contains spaces or other special characters, the TOML is syntactically invalid. No upstream validation in parseMcpServers (packages/persona-kit/src/parse.ts:400`) constrains MCP server names to bare-key-safe characters, so any JSON object key flows through unchecked.

Suggested change
constprefix=`mcp_servers.${name}`;
constprefix=`mcp_servers.${toTomlBasicString(name)}`;
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@khaliqgant

Copy link
Copy Markdown
MemberAuthor

Addressed CodeRabbit feedback in commit 9bac2c2.

  • Added TOML-safe key segment handling for codex MCP server names via toTomlDottedKeySegment().
  • This prevents invalid mcp_servers.... paths when a server name contains dots/special chars (now emitted as quoted segments when needed).
  • Added a regression test covering a dotted server name (nango.docs) and asserting mcp_servers."nango.docs".url=...

Validation: corepack pnpm --filter @agentworkforce/persona-kit test (pass).

@khaliqgant
khaliqgant merged commit c17ff02 into mainMay 11, 2026
2 checks passed
@khaliqgant
khaliqgant deleted the feat/codex-mcpservers-translation branch May 11, 2026 18:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@khaliqgant
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(persona-kit): translate codex mcpServers into launch args - #85

Merged
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation
May 11, 2026
Merged

feat(persona-kit): translate codex mcpServers into launch args#85
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation

Conversation

@khaliqgant

@khaliqgantkhaliqgant commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

  • wire persona-kit codex harness to translate persona mcpServers into codex --config mcp_servers.... args at launch
  • map stdio servers to command/args/env and remote servers to url/http_headers
  • keep codex permission injection as warning-only (unchanged)
  • add focused tests for codex HTTP + stdio translation and SSE warning behavior
  • update docs/comments that previously said codex MCP was unsupported

Relay alignment

  • mirrors the codex MCP arg pattern already used in relay (repeated --config TOML overrides)
  • keeps output deterministic by sorting server keys and inline-table keys

Validation

  • corepack pnpm --filter @agentworkforce/persona-kit test

@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0ea59fc7-c64a-4dc2-8300-4b5ad1a15f57

📥 Commits

Reviewing files that changed from the base of the PR and between 1a814da and 9bac2c2.

📒 Files selected for processing (2)
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/persona-kit/src/interactive-spec.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/persona-kit/src/interactive-spec.ts

📝 Walkthrough

Walkthrough

This PR extends the persona-kit to wire MCP servers for the Codex harness by translating persona mcpServers into TOML config override arguments. Type documentation, integration logic, unit tests, and CLI README guidance are updated to reflect Codex support alongside existing Claude and Opencode behavior.

Changes

Codex MCP Server Support

Layer / File(s)Summary
Type Documentation
packages/persona-kit/src/types.ts
PersonaSpec.mcpServers JSDoc updated to document behavior across harnesses: Claude via --mcp-config, Codex via --config mcp_servers.<name>..., and Opencode warning-only.
Codex TOML Serialization Helpers
packages/persona-kit/src/interactive-spec.ts
Added internal helpers to serialize TOML basic strings/arrays/inline tables, build --config arguments, and construct mcp_servers.<name> entries from persona mcpServers with support for stdio and sse transports (emitting warnings for sse).
MCP Wiring in buildInteractiveSpec
packages/persona-kit/src/interactive-spec.ts
buildInteractiveSpec JSDoc updated to document Codex MCP support; Codex branch now injects mcpServers into command arguments via TOML config overrides instead of emitting an unsupported warning.
Unit Tests
packages/persona-kit/src/interactive-spec.test.ts
Added tests for HTTP and stdio MCP server translation to Codex config args, TOML key quoting test, updated warning test expectations for unsupported permissions and sse transport hints, and adjusted test inputs in an existing warning assertion.
CLI README
packages/cli/README.md
MCP capability table updated to document Codex support; tier selection guidance revised to recommend Claude or Codex for MCP-using personas; Opencode warning case added to troubleshooting section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • AgentWorkforce/workforce#78: Both PRs modify packages/persona-kit/src/interactive-spec.ts; this PR changes Codex MCP wiring where the other PR added buildNonInteractiveSpec.
  • AgentWorkforce/workforce#73: Related changes to interactive-spec implementation and exports that overlap with this PR's edits.

Poem

🐰 I nibble TOML keys in moonlit code,

Codex now learns the MCP road.
Claude keeps its path, Opencode will warn,
Tests hop along at the break of dawn.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main change: adding codex mcpServers translation into launch arguments, which is the core feature implemented across the changeset.
Description check✅ PassedThe description is clearly related to the changeset, detailing the MCP server translation implementation, mapping logic, test additions, and documentation updates that match the file changes.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/codex-mcpservers-translation

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/persona-kit/src/interactive-spec.ts`:
- Around line 119-120: The dotted-key prefix construction in the loop using
mcpServers and the local variable prefix (mcp_servers.${name}) can produce
invalid TOML keys if name contains dots or other special chars; update the code
in packages/persona-kit/src/interactive-spec.ts to either validate server names
against an allowed charset (e.g., /^[A-Za-z0-9_-]+$/) before using them or
escape/quote the segment when building the dotted key (e.g., produce
mcp_servers."escapedName" by adding a small helper escapeTomlKey(name) that
returns a properly backslash-escaped quoted key, and use that helper when
setting prefix inside the for (const [name, server] ...) loop).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 626e0e00-e681-4d6f-b39d-eb790b754e14

📥 Commits

Reviewing files that changed from the base of the PR and between 7c5549c and 1a814da.

📒 Files selected for processing (4)
  • packages/cli/README.md
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
  • packages/persona-kit/src/types.ts

Comment threadpackages/persona-kit/src/interactive-spec.ts Outdated

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

warnings: string[]
): void {
for (const [name, server] of Object.entries(mcpServers).sort(([a], [b]) => a.localeCompare(b))) {
const prefix = `mcp_servers.${name}`;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MCP server name not quoted in TOML dotted-key path, producing invalid or mis-parsed TOML

In appendCodexMcpServerArgs, the MCP server name is interpolated directly into the TOML key path as a bare key: const prefix = \mcp_servers.${name}`. TOML bare keys only support [A-Za-z0-9_-]. If the server name contains dots (e.g. "foo.bar"), TOML interprets mcp_servers.foo.bar.urlas a 4-level nested path instead of the intendedmcp_servers."foo.bar".url. If the name contains spaces or other special characters, the TOML is syntactically invalid. No upstream validation in parseMcpServers (packages/persona-kit/src/parse.ts:400`) constrains MCP server names to bare-key-safe characters, so any JSON object key flows through unchecked.

Suggested change
constprefix=`mcp_servers.${name}`;
constprefix=`mcp_servers.${toTomlBasicString(name)}`;
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@khaliqgant

Copy link
Copy Markdown
MemberAuthor

Addressed CodeRabbit feedback in commit 9bac2c2.

  • Added TOML-safe key segment handling for codex MCP server names via toTomlDottedKeySegment().
  • This prevents invalid mcp_servers.... paths when a server name contains dots/special chars (now emitted as quoted segments when needed).
  • Added a regression test covering a dotted server name (nango.docs) and asserting mcp_servers."nango.docs".url=...

Validation: corepack pnpm --filter @agentworkforce/persona-kit test (pass).

@khaliqgant
khaliqgant merged commit c17ff02 into mainMay 11, 2026
2 checks passed
@khaliqgant
khaliqgant deleted the feat/codex-mcpservers-translation branch May 11, 2026 18:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@khaliqgant
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(persona-kit): translate codex mcpServers into launch args - #85

Merged
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation
May 11, 2026
Merged

feat(persona-kit): translate codex mcpServers into launch args#85
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation

Conversation

@khaliqgant

@khaliqgantkhaliqgant commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

  • wire persona-kit codex harness to translate persona mcpServers into codex --config mcp_servers.... args at launch
  • map stdio servers to command/args/env and remote servers to url/http_headers
  • keep codex permission injection as warning-only (unchanged)
  • add focused tests for codex HTTP + stdio translation and SSE warning behavior
  • update docs/comments that previously said codex MCP was unsupported

Relay alignment

  • mirrors the codex MCP arg pattern already used in relay (repeated --config TOML overrides)
  • keeps output deterministic by sorting server keys and inline-table keys

Validation

  • corepack pnpm --filter @agentworkforce/persona-kit test

@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0ea59fc7-c64a-4dc2-8300-4b5ad1a15f57

📥 Commits

Reviewing files that changed from the base of the PR and between 1a814da and 9bac2c2.

📒 Files selected for processing (2)
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/persona-kit/src/interactive-spec.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/persona-kit/src/interactive-spec.ts

📝 Walkthrough

Walkthrough

This PR extends the persona-kit to wire MCP servers for the Codex harness by translating persona mcpServers into TOML config override arguments. Type documentation, integration logic, unit tests, and CLI README guidance are updated to reflect Codex support alongside existing Claude and Opencode behavior.

Changes

Codex MCP Server Support

Layer / File(s)Summary
Type Documentation
packages/persona-kit/src/types.ts
PersonaSpec.mcpServers JSDoc updated to document behavior across harnesses: Claude via --mcp-config, Codex via --config mcp_servers.<name>..., and Opencode warning-only.
Codex TOML Serialization Helpers
packages/persona-kit/src/interactive-spec.ts
Added internal helpers to serialize TOML basic strings/arrays/inline tables, build --config arguments, and construct mcp_servers.<name> entries from persona mcpServers with support for stdio and sse transports (emitting warnings for sse).
MCP Wiring in buildInteractiveSpec
packages/persona-kit/src/interactive-spec.ts
buildInteractiveSpec JSDoc updated to document Codex MCP support; Codex branch now injects mcpServers into command arguments via TOML config overrides instead of emitting an unsupported warning.
Unit Tests
packages/persona-kit/src/interactive-spec.test.ts
Added tests for HTTP and stdio MCP server translation to Codex config args, TOML key quoting test, updated warning test expectations for unsupported permissions and sse transport hints, and adjusted test inputs in an existing warning assertion.
CLI README
packages/cli/README.md
MCP capability table updated to document Codex support; tier selection guidance revised to recommend Claude or Codex for MCP-using personas; Opencode warning case added to troubleshooting section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • AgentWorkforce/workforce#78: Both PRs modify packages/persona-kit/src/interactive-spec.ts; this PR changes Codex MCP wiring where the other PR added buildNonInteractiveSpec.
  • AgentWorkforce/workforce#73: Related changes to interactive-spec implementation and exports that overlap with this PR's edits.

Poem

🐰 I nibble TOML keys in moonlit code,

Codex now learns the MCP road.
Claude keeps its path, Opencode will warn,
Tests hop along at the break of dawn.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main change: adding codex mcpServers translation into launch arguments, which is the core feature implemented across the changeset.
Description check✅ PassedThe description is clearly related to the changeset, detailing the MCP server translation implementation, mapping logic, test additions, and documentation updates that match the file changes.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/codex-mcpservers-translation

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/persona-kit/src/interactive-spec.ts`:
- Around line 119-120: The dotted-key prefix construction in the loop using
mcpServers and the local variable prefix (mcp_servers.${name}) can produce
invalid TOML keys if name contains dots or other special chars; update the code
in packages/persona-kit/src/interactive-spec.ts to either validate server names
against an allowed charset (e.g., /^[A-Za-z0-9_-]+$/) before using them or
escape/quote the segment when building the dotted key (e.g., produce
mcp_servers."escapedName" by adding a small helper escapeTomlKey(name) that
returns a properly backslash-escaped quoted key, and use that helper when
setting prefix inside the for (const [name, server] ...) loop).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 626e0e00-e681-4d6f-b39d-eb790b754e14

📥 Commits

Reviewing files that changed from the base of the PR and between 7c5549c and 1a814da.

📒 Files selected for processing (4)
  • packages/cli/README.md
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
  • packages/persona-kit/src/types.ts

Comment threadpackages/persona-kit/src/interactive-spec.ts Outdated

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

warnings: string[]
): void {
for (const [name, server] of Object.entries(mcpServers).sort(([a], [b]) => a.localeCompare(b))) {
const prefix = `mcp_servers.${name}`;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MCP server name not quoted in TOML dotted-key path, producing invalid or mis-parsed TOML

In appendCodexMcpServerArgs, the MCP server name is interpolated directly into the TOML key path as a bare key: const prefix = \mcp_servers.${name}`. TOML bare keys only support [A-Za-z0-9_-]. If the server name contains dots (e.g. "foo.bar"), TOML interprets mcp_servers.foo.bar.urlas a 4-level nested path instead of the intendedmcp_servers."foo.bar".url. If the name contains spaces or other special characters, the TOML is syntactically invalid. No upstream validation in parseMcpServers (packages/persona-kit/src/parse.ts:400`) constrains MCP server names to bare-key-safe characters, so any JSON object key flows through unchecked.

Suggested change
constprefix=`mcp_servers.${name}`;
constprefix=`mcp_servers.${toTomlBasicString(name)}`;
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@khaliqgant

Copy link
Copy Markdown
MemberAuthor

Addressed CodeRabbit feedback in commit 9bac2c2.

  • Added TOML-safe key segment handling for codex MCP server names via toTomlDottedKeySegment().
  • This prevents invalid mcp_servers.... paths when a server name contains dots/special chars (now emitted as quoted segments when needed).
  • Added a regression test covering a dotted server name (nango.docs) and asserting mcp_servers."nango.docs".url=...

Validation: corepack pnpm --filter @agentworkforce/persona-kit test (pass).

@khaliqgant
khaliqgant merged commit c17ff02 into mainMay 11, 2026
2 checks passed
@khaliqgant
khaliqgant deleted the feat/codex-mcpservers-translation branch May 11, 2026 18:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@khaliqgant
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(persona-kit): translate codex mcpServers into launch args - #85

Merged
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation
May 11, 2026
Merged

feat(persona-kit): translate codex mcpServers into launch args#85
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation

Conversation

@khaliqgant

@khaliqgantkhaliqgant commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

  • wire persona-kit codex harness to translate persona mcpServers into codex --config mcp_servers.... args at launch
  • map stdio servers to command/args/env and remote servers to url/http_headers
  • keep codex permission injection as warning-only (unchanged)
  • add focused tests for codex HTTP + stdio translation and SSE warning behavior
  • update docs/comments that previously said codex MCP was unsupported

Relay alignment

  • mirrors the codex MCP arg pattern already used in relay (repeated --config TOML overrides)
  • keeps output deterministic by sorting server keys and inline-table keys

Validation

  • corepack pnpm --filter @agentworkforce/persona-kit test

@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0ea59fc7-c64a-4dc2-8300-4b5ad1a15f57

📥 Commits

Reviewing files that changed from the base of the PR and between 1a814da and 9bac2c2.

📒 Files selected for processing (2)
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/persona-kit/src/interactive-spec.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/persona-kit/src/interactive-spec.ts

📝 Walkthrough

Walkthrough

This PR extends the persona-kit to wire MCP servers for the Codex harness by translating persona mcpServers into TOML config override arguments. Type documentation, integration logic, unit tests, and CLI README guidance are updated to reflect Codex support alongside existing Claude and Opencode behavior.

Changes

Codex MCP Server Support

Layer / File(s)Summary
Type Documentation
packages/persona-kit/src/types.ts
PersonaSpec.mcpServers JSDoc updated to document behavior across harnesses: Claude via --mcp-config, Codex via --config mcp_servers.<name>..., and Opencode warning-only.
Codex TOML Serialization Helpers
packages/persona-kit/src/interactive-spec.ts
Added internal helpers to serialize TOML basic strings/arrays/inline tables, build --config arguments, and construct mcp_servers.<name> entries from persona mcpServers with support for stdio and sse transports (emitting warnings for sse).
MCP Wiring in buildInteractiveSpec
packages/persona-kit/src/interactive-spec.ts
buildInteractiveSpec JSDoc updated to document Codex MCP support; Codex branch now injects mcpServers into command arguments via TOML config overrides instead of emitting an unsupported warning.
Unit Tests
packages/persona-kit/src/interactive-spec.test.ts
Added tests for HTTP and stdio MCP server translation to Codex config args, TOML key quoting test, updated warning test expectations for unsupported permissions and sse transport hints, and adjusted test inputs in an existing warning assertion.
CLI README
packages/cli/README.md
MCP capability table updated to document Codex support; tier selection guidance revised to recommend Claude or Codex for MCP-using personas; Opencode warning case added to troubleshooting section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • AgentWorkforce/workforce#78: Both PRs modify packages/persona-kit/src/interactive-spec.ts; this PR changes Codex MCP wiring where the other PR added buildNonInteractiveSpec.
  • AgentWorkforce/workforce#73: Related changes to interactive-spec implementation and exports that overlap with this PR's edits.

Poem

🐰 I nibble TOML keys in moonlit code,

Codex now learns the MCP road.
Claude keeps its path, Opencode will warn,
Tests hop along at the break of dawn.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main change: adding codex mcpServers translation into launch arguments, which is the core feature implemented across the changeset.
Description check✅ PassedThe description is clearly related to the changeset, detailing the MCP server translation implementation, mapping logic, test additions, and documentation updates that match the file changes.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/codex-mcpservers-translation

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/persona-kit/src/interactive-spec.ts`:
- Around line 119-120: The dotted-key prefix construction in the loop using
mcpServers and the local variable prefix (mcp_servers.${name}) can produce
invalid TOML keys if name contains dots or other special chars; update the code
in packages/persona-kit/src/interactive-spec.ts to either validate server names
against an allowed charset (e.g., /^[A-Za-z0-9_-]+$/) before using them or
escape/quote the segment when building the dotted key (e.g., produce
mcp_servers."escapedName" by adding a small helper escapeTomlKey(name) that
returns a properly backslash-escaped quoted key, and use that helper when
setting prefix inside the for (const [name, server] ...) loop).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 626e0e00-e681-4d6f-b39d-eb790b754e14

📥 Commits

Reviewing files that changed from the base of the PR and between 7c5549c and 1a814da.

📒 Files selected for processing (4)
  • packages/cli/README.md
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
  • packages/persona-kit/src/types.ts

Comment threadpackages/persona-kit/src/interactive-spec.ts Outdated

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

warnings: string[]
): void {
for (const [name, server] of Object.entries(mcpServers).sort(([a], [b]) => a.localeCompare(b))) {
const prefix = `mcp_servers.${name}`;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MCP server name not quoted in TOML dotted-key path, producing invalid or mis-parsed TOML

In appendCodexMcpServerArgs, the MCP server name is interpolated directly into the TOML key path as a bare key: const prefix = \mcp_servers.${name}`. TOML bare keys only support [A-Za-z0-9_-]. If the server name contains dots (e.g. "foo.bar"), TOML interprets mcp_servers.foo.bar.urlas a 4-level nested path instead of the intendedmcp_servers."foo.bar".url. If the name contains spaces or other special characters, the TOML is syntactically invalid. No upstream validation in parseMcpServers (packages/persona-kit/src/parse.ts:400`) constrains MCP server names to bare-key-safe characters, so any JSON object key flows through unchecked.

Suggested change
constprefix=`mcp_servers.${name}`;
constprefix=`mcp_servers.${toTomlBasicString(name)}`;
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@khaliqgant

Copy link
Copy Markdown
MemberAuthor

Addressed CodeRabbit feedback in commit 9bac2c2.

  • Added TOML-safe key segment handling for codex MCP server names via toTomlDottedKeySegment().
  • This prevents invalid mcp_servers.... paths when a server name contains dots/special chars (now emitted as quoted segments when needed).
  • Added a regression test covering a dotted server name (nango.docs) and asserting mcp_servers."nango.docs".url=...

Validation: corepack pnpm --filter @agentworkforce/persona-kit test (pass).

@khaliqgant
khaliqgant merged commit c17ff02 into mainMay 11, 2026
2 checks passed
@khaliqgant
khaliqgant deleted the feat/codex-mcpservers-translation branch May 11, 2026 18:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@khaliqgant
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(persona-kit): translate codex mcpServers into launch args - #85

Merged
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation
May 11, 2026
Merged

feat(persona-kit): translate codex mcpServers into launch args#85
khaliqgant merged 2 commits into
mainfrom
feat/codex-mcpservers-translation

Conversation

@khaliqgant

@khaliqgantkhaliqgant commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

  • wire persona-kit codex harness to translate persona mcpServers into codex --config mcp_servers.... args at launch
  • map stdio servers to command/args/env and remote servers to url/http_headers
  • keep codex permission injection as warning-only (unchanged)
  • add focused tests for codex HTTP + stdio translation and SSE warning behavior
  • update docs/comments that previously said codex MCP was unsupported

Relay alignment

  • mirrors the codex MCP arg pattern already used in relay (repeated --config TOML overrides)
  • keeps output deterministic by sorting server keys and inline-table keys

Validation

  • corepack pnpm --filter @agentworkforce/persona-kit test

@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0ea59fc7-c64a-4dc2-8300-4b5ad1a15f57

📥 Commits

Reviewing files that changed from the base of the PR and between 1a814da and 9bac2c2.

📒 Files selected for processing (2)
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/persona-kit/src/interactive-spec.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/persona-kit/src/interactive-spec.ts

📝 Walkthrough

Walkthrough

This PR extends the persona-kit to wire MCP servers for the Codex harness by translating persona mcpServers into TOML config override arguments. Type documentation, integration logic, unit tests, and CLI README guidance are updated to reflect Codex support alongside existing Claude and Opencode behavior.

Changes

Codex MCP Server Support

Layer / File(s)Summary
Type Documentation
packages/persona-kit/src/types.ts
PersonaSpec.mcpServers JSDoc updated to document behavior across harnesses: Claude via --mcp-config, Codex via --config mcp_servers.<name>..., and Opencode warning-only.
Codex TOML Serialization Helpers
packages/persona-kit/src/interactive-spec.ts
Added internal helpers to serialize TOML basic strings/arrays/inline tables, build --config arguments, and construct mcp_servers.<name> entries from persona mcpServers with support for stdio and sse transports (emitting warnings for sse).
MCP Wiring in buildInteractiveSpec
packages/persona-kit/src/interactive-spec.ts
buildInteractiveSpec JSDoc updated to document Codex MCP support; Codex branch now injects mcpServers into command arguments via TOML config overrides instead of emitting an unsupported warning.
Unit Tests
packages/persona-kit/src/interactive-spec.test.ts
Added tests for HTTP and stdio MCP server translation to Codex config args, TOML key quoting test, updated warning test expectations for unsupported permissions and sse transport hints, and adjusted test inputs in an existing warning assertion.
CLI README
packages/cli/README.md
MCP capability table updated to document Codex support; tier selection guidance revised to recommend Claude or Codex for MCP-using personas; Opencode warning case added to troubleshooting section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • AgentWorkforce/workforce#78: Both PRs modify packages/persona-kit/src/interactive-spec.ts; this PR changes Codex MCP wiring where the other PR added buildNonInteractiveSpec.
  • AgentWorkforce/workforce#73: Related changes to interactive-spec implementation and exports that overlap with this PR's edits.

Poem

🐰 I nibble TOML keys in moonlit code,

Codex now learns the MCP road.
Claude keeps its path, Opencode will warn,
Tests hop along at the break of dawn.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main change: adding codex mcpServers translation into launch arguments, which is the core feature implemented across the changeset.
Description check✅ PassedThe description is clearly related to the changeset, detailing the MCP server translation implementation, mapping logic, test additions, and documentation updates that match the file changes.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/codex-mcpservers-translation

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/persona-kit/src/interactive-spec.ts`:
- Around line 119-120: The dotted-key prefix construction in the loop using
mcpServers and the local variable prefix (mcp_servers.${name}) can produce
invalid TOML keys if name contains dots or other special chars; update the code
in packages/persona-kit/src/interactive-spec.ts to either validate server names
against an allowed charset (e.g., /^[A-Za-z0-9_-]+$/) before using them or
escape/quote the segment when building the dotted key (e.g., produce
mcp_servers."escapedName" by adding a small helper escapeTomlKey(name) that
returns a properly backslash-escaped quoted key, and use that helper when
setting prefix inside the for (const [name, server] ...) loop).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 626e0e00-e681-4d6f-b39d-eb790b754e14

📥 Commits

Reviewing files that changed from the base of the PR and between 7c5549c and 1a814da.

📒 Files selected for processing (4)
  • packages/cli/README.md
  • packages/persona-kit/src/interactive-spec.test.ts
  • packages/persona-kit/src/interactive-spec.ts
  • packages/persona-kit/src/types.ts

Comment threadpackages/persona-kit/src/interactive-spec.ts Outdated

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

warnings: string[]
): void {
for (const [name, server] of Object.entries(mcpServers).sort(([a], [b]) => a.localeCompare(b))) {
const prefix = `mcp_servers.${name}`;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MCP server name not quoted in TOML dotted-key path, producing invalid or mis-parsed TOML

In appendCodexMcpServerArgs, the MCP server name is interpolated directly into the TOML key path as a bare key: const prefix = \mcp_servers.${name}`. TOML bare keys only support [A-Za-z0-9_-]. If the server name contains dots (e.g. "foo.bar"), TOML interprets mcp_servers.foo.bar.urlas a 4-level nested path instead of the intendedmcp_servers."foo.bar".url. If the name contains spaces or other special characters, the TOML is syntactically invalid. No upstream validation in parseMcpServers (packages/persona-kit/src/parse.ts:400`) constrains MCP server names to bare-key-safe characters, so any JSON object key flows through unchecked.

Suggested change
constprefix=`mcp_servers.${name}`;
constprefix=`mcp_servers.${toTomlBasicString(name)}`;
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@khaliqgant

Copy link
Copy Markdown
MemberAuthor

Addressed CodeRabbit feedback in commit 9bac2c2.

  • Added TOML-safe key segment handling for codex MCP server names via toTomlDottedKeySegment().
  • This prevents invalid mcp_servers.... paths when a server name contains dots/special chars (now emitted as quoted segments when needed).
  • Added a regression test covering a dotted server name (nango.docs) and asserting mcp_servers."nango.docs".url=...

Validation: corepack pnpm --filter @agentworkforce/persona-kit test (pass).

@khaliqgant
khaliqgant merged commit c17ff02 into mainMay 11, 2026
2 checks passed
@khaliqgant
khaliqgant deleted the feat/codex-mcpservers-translation branch May 11, 2026 18:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@khaliqgant