AGENTS.md
packages/omo-opencode/src/features/skill-mcp-manager/AGENTS.mdAGENTS.md
Quality
70/100
Scores the file, not the repository.Length
546 words
13 headings · 5 code blocksRepository
67k
— · pushed 0 days agoLast changed
2 days ago
First indexed 2 days ago.1# src/features/skill-mcp-manager/ — Skill-Embedded MCP Client Lifecycle23**Generated:** 2026-05-1545## OVERVIEW67This module manages **tier 3** of the MCP system: skill-embedded MCP servers declared in SKILL.md YAML frontmatter. Per-session client isolation, dual transport (stdio + HTTP), OAuth 2.0 with step-up authentication, idle cleanup. Harness-neutral MCP client lifecycle and OAuth primitives are extracted to [`packages/mcp-client-core/`](../../../../../packages/mcp-client-core); this directory keeps the OpenCode manager wiring stable.89## THREE-TIER MCP CONTEXT1011| Tier | Manager | Scope |12|------|---------|-------|13| 1. Built-in | `createBuiltinMcps()` (src/mcp/) | Global, 3 remote HTTP + 1 local stdio (`lsp`) |14| 2. Claude Code | `claude-code-mcp-loader` (src/features/) | From `.mcp.json` |15| 3. **Skill-embedded** | **`SkillMcpManager` (this module)** | **Per-session, from SKILL.md YAML** |1617## CLIENT KEY FORMAT1819```20${sessionID}:${skillName}:${serverName}21```2223Enables: per-session isolation, same skill usable in multiple sessions concurrently, multiple servers per skill.2425## DUAL TRANSPORT2627| Type | File | Backend |28|------|------|---------|29| **stdio** | `stdio-client.ts` | `StdioClientTransport` (local process) |30| **http** | `http-client.ts` | `StreamableHTTPClientTransport` (remote) |3132**Detection** (connection-type.ts): explicit `type` field → URL presence → command presence. Legacy `"sse"` mapped to http.3334## STATE3536```typescript37interface SkillMcpManagerState {38 clients: Map<clientKey, ManagedClient> // Active connections39 pendingConnections: Map<clientKey, Promise<Client>> // Race prevention40 disconnectedSessions: Map<sessionID, generation> // Stale connection detection41 authProviders: Map<url, OAuthProvider> // OAuth state per server42 inFlightConnections: Map<sessionID, count> // Connection counting43}44```4546## KEY FILES4748| File | Purpose |49|------|---------|50| `manager.ts` | `SkillMcpManager` class — main API (getOrCreateClient, disconnectSession, listTools, callTool, etc.) |51| `types.ts` | `ManagedStdioClient`, `ManagedHttpClient`, `SkillMcpManagerState`, `ConnectionType` |52| `connection.ts` | Client factory with race prevention, retry, env var expansion |53| `connection-type.ts` | Detect stdio vs http from config (legacy sse → http) |54| `stdio-client.ts` | Stdio transport factory |55| `http-client.ts` | HTTP transport factory |56| `cleanup.ts` | SIGINT/SIGTERM handlers, idle timer (60s interval, 5min TTL) |57| `oauth-handler.ts` | OAuth token management, refresh, step-up (403 scope escalation) |58| `env-cleaner.ts` | Filter npm/pnpm/yarn config + 25+ secret patterns (_KEY, _SECRET, _TOKEN) |59| `error-redaction.ts` | Redact sensitive data from error messages before logging |6061## LIFECYCLE INTEGRATION6263**Hook**: `src/plugin/event.ts` on `session.deleted`:64```typescript65await managers.skillMcpManager.disconnectSession(sessionInfo.id)66```6768## LIFECYCLE FLOW6970```711. session.created → No action (lazy connection)722. First MCP tool call → getOrCreateClient() creates + caches733. Ongoing use → lastUsedAt timestamp updated744. Idle >5min → cleanup timer removes755. session.deleted → disconnectSession() closes session clients766. Process exit → disconnectAll() via SIGINT/SIGTERM handlers77```7879## RACE CONDITION PREVENTION8081- **pendingConnections**: Deduplicates concurrent connection attempts for same key82- **inFlightConnections**: Per-session counter, prevents premature cleanup during connection setup83- **shutdownGeneration**: Counter-based stale connection detection after disconnect8485## PUBLIC API8687```typescript88class SkillMcpManager {89 constructor(options?: { createOAuthProvider? })90 getOrCreateClient(info, config): Promise<Client>91 disconnectSession(sessionID): Promise<void>92 disconnectAll(): Promise<void>93 listTools/Resources/Prompts(info, context): Promise<...[]>94 callTool(info, context, name, args): Promise<unknown>95 readResource(info, context, uri): Promise<unknown>96 getPrompt(info, context, name, args): Promise<unknown>97 getConnectedServers(): string[]98 isConnected(info): boolean99}100```101102## RETRY SEMANTICS103104- `getOrCreateClientWithRetry()` — 3 attempts with force reconnect on failure105- `withOperationRetry()` — OAuth-aware wrapper: step-up on 403, token refresh on 401106107## SECURITY108109- **env-cleaner.ts** — strips npm/pnpm config vars (prevents pnpm project isolation issues) and secret patterns before stdio spawn110- **error-redaction.ts** — masks tokens/secrets in error messages before logger.log111- **OAuth isolation** — auth providers keyed by server URL, tokens never cross servers112
Also in code-yeongyu/oh-my-openagent
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| code-yeongyu/oh-my-openagentpackages/omo-opencode/src/features/claude-code-agent-loader/AGENTS.md · 67k | AGENTS.md | archdeploymentagent-behaviour | 62/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/omo-opencode/src/features/claude-code-mcp-loader/AGENTS.md · 67k | AGENTS.md | lint-formatarchsecuritydeployment+1 | 66/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/omo-opencode/src/tools/background-task/AGENTS.md · 67k | AGENTS.md | arch | 70/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentscript/AGENTS.md · 67k | AGENTS.md | buildtestarchdeployment | 80/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/omo-opencode/src/features/claude-code-plugin-loader/AGENTS.md · 67k | AGENTS.md | archdeploymentagent-behaviour | 70/100 | 2 days ago | |
| code-yeongyu/oh-my-openagent.agents/AGENTS.md · 67k | AGENTS.md | stylearchtesting-strategydatabase | 64/100 | 2 days ago | |
| code-yeongyu/oh-my-openagent.opencode/AGENTS.md · 67k | AGENTS.md | stylearchdo-not | 71/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentAGENTS.md · 67k | AGENTS.md | setupbuildtestlint-format+11 | 84/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentassets/AGENTS.md · 67k | AGENTS.md | buildteststylearch | 88/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentbin/AGENTS.md · 67k | AGENTS.md | teststylearch | 64/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/AGENTS.md · 67k | AGENTS.md | buildtestlint-formatstyle+3 | 83/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/agents-md-core/AGENTS.md · 67k | AGENTS.md | archdependenciesapi | 48/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/boulder-state/AGENTS.md · 67k | AGENTS.md | archapi | 48/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/claude-code-compat-core/AGENTS.md · 67k | AGENTS.md | archagent-behaviour | 56/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/comment-checker-core/AGENTS.md · 67k | AGENTS.md | archdependenciesapi | 48/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/delegate-core/AGENTS.md · 67k | AGENTS.md | stylearchdependenciesapi | 60/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/git-bash-mcp/AGENTS.md · 67k | AGENTS.md | buildtestlint-formatarch+1 | 82/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/hashline-core/AGENTS.md · 67k | AGENTS.md | archtypesdependenciesapi | 48/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/lsp-core/AGENTS.md · 67k | AGENTS.md | archmonorepo | 43/100 | 2 days ago | |
| code-yeongyu/oh-my-openagentpackages/lsp-daemon/AGENTS.md · 67k | AGENTS.md | buildtestlint-formatarch+1 | 89/100 | today |
Diff against packages/omo-opencode/src/features/claude-code-agent-loader/AGENTS.md Diff against packages/omo-opencode/src/features/claude-code-mcp-loader/AGENTS.md Diff against packages/omo-opencode/src/tools/background-task/AGENTS.md Diff against script/AGENTS.md Diff against packages/omo-opencode/src/features/claude-code-plugin-loader/AGENTS.md Diff against .agents/AGENTS.md Diff against .opencode/AGENTS.md Diff against AGENTS.md Diff against assets/AGENTS.md Diff against bin/AGENTS.md Diff against packages/AGENTS.md Diff against packages/agents-md-core/AGENTS.md Diff against packages/boulder-state/AGENTS.md Diff against packages/claude-code-compat-core/AGENTS.md Diff against packages/comment-checker-core/AGENTS.md Diff against packages/delegate-core/AGENTS.md Diff against packages/git-bash-mcp/AGENTS.md Diff against packages/hashline-core/AGENTS.md Diff against packages/lsp-core/AGENTS.md Diff against packages/lsp-daemon/AGENTS.md
Similar configs
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| aaif-goose/gooseAGENTS.md · 52k | AGENTS.md | setupbuildtestlint-format+6 | 100/100 | 3 days ago | |
| TryGhost/Ghoste2e/AGENTS.md · 55k | AGENTS.md | setupteststylearch+2 | 100/100 | 3 days ago | |
| duckduckgo/content-scope-scriptsspecial-pages/AGENTS.md · 70 | AGENTS.md | buildteststylearch+3 | 100/100 | 3 days ago | |
| n8n-io/n8npackages/@n8n/agents/AGENTS.md · 199k | AGENTS.md | buildteststylearch+3 | 100/100 | 3 days ago | |
| mui/material-uiAGENTS.md · 99k | AGENTS.md | setupbuildtestlint-format+9 | 100/100 | 3 days ago | |
| SkeneTechnologies/skene-cookbookAGENTS.md · 51 | AGENTS.md | setupbuildtestlint-format+7 | 100/100 | 2 days ago | |
| trick77/agents-md-syncAGENTS.md · 2 | AGENTS.md | setupbuildteststyle+5 | 100/100 | 3 days ago | |
| code-yeongyu/oh-my-openagentpackages/web/AGENTS.md · 67k | AGENTS.md | setupbuildtestlint-format+6 | 100/100 | 2 days ago |
