{"_id":"@awsljx/pi-mcp","name":"@awsljx/pi-mcp","dist-tags":{"reconnect":"0.4.0-reconnect.1","latest":"0.4.0-reconnect.1"},"versions":{"0.4.0-reconnect.1":{"name":"@awsljx/pi-mcp","version":"0.4.0-reconnect.1","description":"Model Context Protocol (MCP) integration for pi-coding-agent. Connect to any MCP server (stdio, SSE, StreamableHTTP, WebSocket) and use its tools, resources, and prompts natively.","keywords":["pi-package","pi-extension","mcp","model-context-protocol","tools","resources","prompts","0xkobold"],"author":{"name":"0xKobold"},"license":"MIT","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"},"./client":{"import":"./dist/client/index.js","types":"./dist/client/index.d.ts"},"./config":{"import":"./dist/config/index.js","types":"./dist/config/index.d.ts"},"./tools":{"import":"./dist/tools/index.js","types":"./dist/tools/index.d.ts"}},"scripts":{"build":"tsc","dev":"tsc --watch","test":"bun test","prepublishOnly":"rm -rf dist && tsc"},"pi":{"extensions":["./dist/index.js"],"skills":["./skills/mcp/SKILL.md"]},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"peerDependencies":{"@mariozechner/pi-coding-agent":">=0.62.0","@sinclair/typebox":">=0.32.0"},"devDependencies":{"@mariozechner/pi-coding-agent":">=0.62.0","@sinclair/typebox":">=0.32.0","@types/bun":"latest","@types/node":"^20.0.0","typescript":"^6.0.0"},"repository":{"type":"git","url":"git+https://github.com/0xKobold/pi-mcp.git"},"bugs":{"url":"https://github.com/0xKobold/pi-mcp/issues"},"homepage":"https://github.com/0xKobold/pi-mcp#readme","_id":"@awsljx/pi-mcp@0.4.0-reconnect.1","_integrity":"sha512-yUbCLGaJiXFght37jmQsspXSflLn7SmpdM9kh4Kh9HOWk6zjz0I0Wki+E0sBP8PPgH+n8d/KDlEgVtZN8lXUZw==","_resolved":"E:\\Project\\AsdClaw-v2\\.tmp\\pi-mcp-upstream\\awsljx-pi-mcp-0.4.0-reconnect.1.tgz","_from":"file:awsljx-pi-mcp-0.4.0-reconnect.1.tgz","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-yUbCLGaJiXFght37jmQsspXSflLn7SmpdM9kh4Kh9HOWk6zjz0I0Wki+E0sBP8PPgH+n8d/KDlEgVtZN8lXUZw==","shasum":"1a49de2167056d5de5583bb48a9704ebfdc15318","tarball":"https://registry.npmjs.org/@awsljx/pi-mcp/-/pi-mcp-0.4.0-reconnect.1.tgz","fileCount":20,"unpackedSize":156424,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFhMMF9D5shNqHB516p8538YWCgjhu01oyBA8juWpxjTAiAg5p5AFRWFwQjsawW0O/VeJ3EOwk2s3Oj55sOG4QCYOw=="}]},"_npmUser":{"name":"awsljx","email":"awsljx@gmail.com"},"directories":{},"maintainers":[{"name":"awsljx","email":"awsljx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-mcp_0.4.0-reconnect.1_1784275376821_0.6929506652504225"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-17T08:02:56.703Z","0.4.0-reconnect.1":"2026-07-17T08:02:56.953Z","modified":"2026-07-17T08:02:57.178Z"},"maintainers":[{"name":"awsljx","email":"awsljx@gmail.com"}],"description":"Model Context Protocol (MCP) integration for pi-coding-agent. Connect to any MCP server (stdio, SSE, StreamableHTTP, WebSocket) and use its tools, resources, and prompts natively.","homepage":"https://github.com/0xKobold/pi-mcp#readme","keywords":["pi-package","pi-extension","mcp","model-context-protocol","tools","resources","prompts","0xkobold"],"repository":{"type":"git","url":"git+https://github.com/0xKobold/pi-mcp.git"},"author":{"name":"0xKobold"},"bugs":{"url":"https://github.com/0xKobold/pi-mcp/issues"},"license":"MIT","readme":"# @0xkobold/pi-mcp\r\n\r\n> Model Context Protocol (MCP) integration for [pi-coding-agent](https://github.com/nicholasgasior/pi-coding-agent)\r\n\r\nConnect to any MCP server and use its tools, resources, and prompts natively within your pi agent.\r\n\r\n## Features\r\n\r\n- 🌐 **Four Transport Types** - stdio, SSE, StreamableHTTP, and WebSocket\r\n- 🔧 **Auto Tool Registration** - MCP tools appear as native pi tools\r\n- 🔒 **Tool Filtering** - Allowlist/denylist to control which tools are registered\r\n- 📦 **Resource Access** - Read MCP server resources directly\r\n- 💬 **Prompt Templates** - Use MCP prompt templates\r\n- 🌱 **Roots Support** - Servers can discover workspace roots\r\n- 🔄 **Auto-Reconnect** - Reconnects on disconnect with exponential backoff\r\n- 🔐 **Env Interpolation** - `${VAR}` in config resolved from environment\r\n- 📥 **Claude Desktop Import** - Import servers from `~/.claude/mcp.json`\r\n- ⚙️ **Hot Config** - Add/remove servers without restart (commands)\r\n\r\n## Quick Start\r\n\r\n### 1. Configure servers\r\n\r\nEdit `~/.0xkobold/mcp.json`:\r\n\r\n```json\r\n{\r\n  \"servers\": [\r\n    {\r\n      \"name\": \"filesystem\",\r\n      \"transport\": {\r\n        \"type\": \"stdio\",\r\n        \"command\": \"npx\",\r\n        \"args\": [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/home/user\"]\r\n      },\r\n      \"enabled\": true,\r\n      \"autoReconnect\": true\r\n    }\r\n  ],\r\n  \"importClaudeDesktop\": true\r\n}\r\n```\r\n\r\n### 2. Or use commands\r\n\r\n```\r\n/mcp add filesystem npx -y @modelcontextprotocol/server-filesystem /home/user\r\n/mcp enable filesystem\r\n/mcp connect filesystem\r\n```\r\n\r\n### 3. Use tools\r\n\r\nThe agent will automatically discover and use MCP tools. You can also:\r\n\r\n```\r\n/mcp list          # See all configured servers\r\n/mcp status        # See active connections\r\n/mcp discover      # Find available tools\r\n```\r\n\r\n## Commands\r\n\r\n| Command | Description |\r\n|---------|-------------|\r\n| `/mcp` | Show help |\r\n| `/mcp list` | List all configured servers |\r\n| `/mcp connect <name>` | Connect to a server |\r\n| `/mcp disconnect <name>` | Disconnect from a server |\r\n| `/mcp enable <name>` | Enable auto-connect for a server |\r\n| `/mcp disable <name>` | Disable auto-connect for a server |\r\n| `/mcp add <name> <cmd> [args]` | Add a stdio server |\r\n| `/mcp add-http <name> <url>` | Add an HTTP server |\r\n| `/mcp add-ws <name> <url>` | Add a WebSocket server |\r\n| `/mcp filter <name> allow <tools>` | Only register listed tools for server |\r\n| `/mcp filter <name> deny <tools>` | Register all except listed tools |\r\n| `/mcp filter <name> clear` | Remove tool filters for server |\r\n| `/mcp remove <name>` | Remove a server from config |\r\n| `/mcp refresh <name>` | Re-discover tools/resources/prompts |\r\n| `/mcp import` | Import servers from Claude Desktop config |\r\n| `/mcp status` | Show active connections |\r\n\r\n## Tools\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `mcp_discover` | List available MCP tools, resources, and prompts |\r\n| `mcp_call_tool` | Call any MCP tool by server + tool name |\r\n| `mcp_<server>_<tool>` | Individual tools (auto-registered per server) |\r\n| `mcp_<server>_read_resource` | Read a resource from an MCP server |\r\n| `mcp_<server>_get_prompt` | Get a prompt from an MCP server |\r\n\r\n## Transport Types\r\n\r\n### stdio\r\nSpawns a local process and communicates via stdin/stdout:\r\n```json\r\n{\r\n  \"type\": \"stdio\",\r\n  \"command\": \"npx\",\r\n  \"args\": [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/path\"],\r\n  \"env\": { \"API_KEY\": \"...\" },\r\n  \"cwd\": \"/working/dir\"\r\n}\r\n```\r\n\r\n### StreamableHTTP\r\nModern HTTP transport (recommended for remote servers):\r\n```json\r\n{\r\n  \"type\": \"streamable-http\",\r\n  \"url\": \"https://example.com/mcp\",\r\n  \"headers\": { \"Authorization\": \"Bearer ...\" }\r\n}\r\n```\r\n\r\n### SSE (legacy)\r\nServer-Sent Events transport:\r\n```json\r\n{\r\n  \"type\": \"sse\",\r\n  \"url\": \"https://example.com/sse\"\r\n}\r\n```\r\n\r\n### WebSocket\r\nReal-time bidirectional transport:\r\n```json\r\n{\r\n  \"type\": \"websocket\",\r\n  \"url\": \"ws://localhost:8080/mcp\"\r\n}\r\n```\r\n\r\n## Tool Filtering\r\n\r\nControl which tools are registered per server using allowlist or denylist:\r\n\r\n```json\r\n// Only register specific tools (allowlist)\r\n{\r\n  \"name\": \"filesystem\",\r\n  \"allowedTools\": [\"read_file\", \"list_directory\"],\r\n  ...\r\n}\r\n\r\n// Register all except (denylist)\r\n{\r\n  \"name\": \"github\",\r\n  \"deniedTools\": [\"delete_repository\", \"create_issue\"],\r\n  ...\r\n}\r\n```\r\n\r\nOr via commands:\r\n```\r\n/mcp filter github allow search_repositories,get_file_contents\r\n/mcp filter filesystem deny write_file,delete_file\r\n/mcp filter github clear\r\n```\r\n\r\n## Environment Variable Interpolation\r\n\r\nUse `${ENV_VAR}` patterns in config values to avoid hardcoding secrets:\r\n\r\n```json\r\n{\r\n  \"name\": \"github\",\r\n  \"transport\": {\r\n    \"type\": \"stdio\",\r\n    \"command\": \"npx\",\r\n    \"args\": [\"-y\", \"@modelcontextprotocol/server-github\"],\r\n    \"env\": {\r\n      \"GITHUB_TOKEN\": \"${GITHUB_TOKEN}\"\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nHTTP headers also support interpolation:\r\n```json\r\n{\r\n  \"transport\": {\r\n    \"type\": \"streamable-http\",\r\n    \"url\": \"https://api.example.com/mcp\",\r\n    \"headers\": {\r\n      \"Authorization\": \"Bearer ${API_TOKEN}\"\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n## As a Library\r\n\r\nYou can use `@0xkobold/pi-mcp` as a standalone library, without pi-coding-agent:\r\n\r\n```typescript\r\n// Main entry — extension + all re-exports\r\nimport mcpExtension, {\r\n  MCPConnectionManager,\r\n  ResourceCache,\r\n  interpolateEnv,\r\n  loadConfig,\r\n  saveConfig,\r\n  createDefaultConfig,\r\n  isToolAllowed,\r\n} from \"@0xkobold/pi-mcp\";\r\n\r\n// Client subpath — connection management only\r\nimport { MCPConnectionManager, type MCPServerConfig } from \"@0xkobold/pi-mcp/client\";\r\n\r\n// Config subpath — config loading/saving only\r\nimport { loadConfig, upsertServer, type MCPConfig } from \"@0xkobold/pi-mcp/config\";\r\n\r\n// Tools subpath — tool registration utilities only\r\nimport { isToolAllowed, DEFAULT_MAX_TOOLS } from \"@0xkobold/pi-mcp/tools\";\r\n```\r\n\r\nQuick start without pi-coding-agent:\r\n\r\n```typescript\r\nimport { MCPConnectionManager } from \"@0xkobold/pi-mcp/client\";\r\n\r\nconst manager = new MCPConnectionManager([process.cwd()]);\r\n\r\nconst serverConfig = {\r\n  name: \"filesystem\",\r\n  transport: { type: \"stdio\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/tmp\"] },\r\n  enabled: true,\r\n  autoReconnect: true,\r\n};\r\n\r\nconst info = await manager.connect(serverConfig);\r\nconsole.log(`Connected: ${info.tools.length} tools`);\r\n\r\nconst result = await manager.callTool(\"filesystem\", \"read_file\", { path: \"/tmp/hello.txt\" });\r\nconsole.log(result);\r\n```\r\n\r\n## Architecture\r\n\r\n```\r\nsrc/\r\n├── index.ts          # Extension entry point (commands, tools, lifecycle)\r\n├── client/\r\n│   └── index.ts      # MCPConnectionManager - SDK-based client connections\r\n├── config/\r\n│   └── index.ts      # Config loading/saving, Claude Desktop import\r\n└── tools/\r\n    └── index.ts      # Tool bridge - MCP tools → pi tools\r\n```\r\n\r\n## Configuration\r\n\r\n**Config file**: `~/.0xkobold/mcp.json`\r\n\r\n**Full schema**:\r\n```json\r\n{\r\n  \"servers\": [\r\n    {\r\n      \"name\": \"string (required)\",\r\n      \"transport\": {\r\n        \"type\": \"stdio | sse | streamable-http | websocket\",\r\n        // stdio fields:\r\n        \"command\": \"string\",\r\n        \"args\": [\"string\"],\r\n        \"env\": {},\r\n        \"cwd\": \"string\",\r\n        // http/sse fields:\r\n        \"url\": \"string\",\r\n        \"headers\": {},\r\n        \"sessionId\": \"string\",\r\n        // websocket fields:\r\n        \"url\": \"ws://...\"\r\n      },\r\n      \"enabled\": false,\r\n      \"autoReconnect\": true,\r\n      \"maxReconnectAttempts\": 5,\r\n      \"reconnectDelayMs\": 1000,\r\n      \"connectTimeoutMs\": 30000,\r\n      \"allowedTools\": [\"tool_name\"],\r\n      \"deniedTools\": [\"tool_name\"]\r\n    }\r\n  ],\r\n  \"importClaudeDesktop\": true\r\n}\r\n```\r\n\r\n## Claude Desktop Compatibility\r\n\r\nSet `\"importClaudeDesktop\": true` to automatically discover servers from:\r\n- `~/.claude/mcp.json`\r\n- `~/.config/claude-code/mcp.json`\r\n\r\nOr run `/mcp import` to manually import.\r\n\r\n## Development\r\n\r\n```bash\r\n# Install dependencies\r\nbun install\r\n\r\n# Build\r\nbun run build\r\n\r\n# Development watch\r\nbun run dev\r\n\r\n# Test\r\nbun test    # 69 tests, 134 assertions\r\nbun test test/unit.test.ts  # Unit tests only\r\nbun test test/integration.test.ts  # Integration tests (requires npx)\r\n```\r\n\r\n## License\r\n\r\nMIT","readmeFilename":"README.md","_rev":"1-2fc4b7ee894fed25c52f86a06bc10d82"}