{"slug": "show-hn-heku-dynamic-mcp-tooling-via-json-configs", "title": "Show HN: Heku – Dynamic MCP Tooling via JSON Configs", "summary": "RapidThought Labs launched Heku, a single MCP server that dynamically serves tools via JSON configs, eliminating context bloat by lazy-loading only the tools an LLM needs. The open-source tool supports eight connector types, hot-reload, and self-managing configs, enabling agents to write their own tool definitions from API docs.", "body_md": "One server. Any API. Any LLM.\n\n**Your agent's tool manifest breaks around ten MCP servers.** Every server you add fattens the manifest until the context fills up and the model starts forgetting which tools exist. heku is one [MCP](https://modelcontextprotocol.io) server that removes that ceiling: you describe each tool as a JSON config, and heku serves them *lazily* — the manifest stays a few hundred tokens whether you've loaded ten configs or two hundred, and the model pulls in only the tools it needs, when it needs them.\n\nOne server, any number of APIs, no context bloat. Agents can even write their own configs live from API docs.\n\n```\nnpx @rapidthoughtlabs/heku start\n```\n\n** Website** ·\n\n**·**\n\n[Launch post →](https://www.rapidthoughtlabs.com/blog/heku-dynamic-tooling)**·**\n\n[Console](https://console.rapidthoughtlabs.space)\n\n[heku hub](https://app.rapidthoughtlabs.space)** console.rapidthoughtlabs.space** — hosted console you can point at any running heku instance. Connect, browse configs, chat with your tools, and inspect the system prompt — no local build needed.\n\n** app.rapidthoughtlabs.space** —\n\n**heku hub**, the online registry for browsing, installing, and publishing heku configs. Find community-built connectors for GitHub, Slack, Linear, and more — or publish your own.\n\nInstall (requires **Node.js ≥ 20**):\n\n```\nnpx @rapidthoughtlabs/heku start\n# or: npm install -g @rapidthoughtlabs/heku && heku start\n```\n\nCreate `mcp-configs/mcp.github.json`\n\n:\n\n```\n{\n  \"id\": \"github-http\",\n  \"name\": \"GitHub API\",\n  \"description\": \"Manage GitHub repos, issues, and pull requests\",\n  \"connector\": {\n    \"type\": \"http\",\n    \"base_url\": \"https://api.github.com\",\n    \"auth\": { \"type\": \"bearer\", \"token_env\": \"GITHUB_TOKEN\" }\n  },\n  \"tools\": [\n    {\n      \"name\": \"list_repos\",\n      \"description\": \"List repositories for the authenticated user\",\n      \"method\": \"GET\",\n      \"path\": \"/user/repos\",\n      \"params\": [\n        { \"name\": \"per_page\", \"type\": \"number\", \"required\": false, \"location\": \"query\", \"description\": \"Results per page\" }\n      ]\n    }\n  ]\n}\nheku auth setup github-http   # writes GITHUB_TOKEN to .env\nheku start\n```\n\nYour LLM now has a `github-http.list_repos`\n\ntool — and the manifest grew by only that one entry.\n\nheku sits between your LLM and every API you've configured. Three ideas make it different from running a pile of separate MCP servers:\n\n**Lazy discovery.** The manifest the model sees stays small no matter how many configs you load. Tools are surfaced on demand instead of dumped up front, so you never hit the ~ten-server context wall.**Configs, not code.** A tool is a JSON file — an endpoint, its params, and how to authenticate. No per-integration server to build, ship, or maintain.**Self-managing.** Point heku at API docs and it can author and edit its own configs through internal tools, then hot-reload them without a restart.\n\nTool names follow the pattern `config_id.tool_name`\n\n— e.g. `github-http.list_repos`\n\n, `linear-graphql.create_issue`\n\n.\n\n**8 connector types**— 4 standard (HTTP, GraphQL, gRPC, child-MCP) + 4 experimental (CLI, File, SQL, MongoDB)** Lazy tool discovery**— manifest stays a few hundred tokens regardless of how many configs are loaded** Hot-reload**— add or edit a config, tools update live without restart** Auto-discovery**— gRPC reflection, GraphQL introspection, and child MCP tool listing fill in tools automatically** Response stripping**— base64 blobs, null fields, oversized strings, and long arrays are trimmed before the model sees them, keeping context lean without losing data**Built-in console UI**— React dashboard for chat, config editing, and registry browsing** heku hub**— publish and install community configs from[app.rapidthoughtlabs.space](https://app.rapidthoughtlabs.space)** Auth handled**— bearer, basic, API key, and OAuth2 with`.env`\n\n-based credential management**Self-managing**— the server can create and edit its own configs via internal tools\n\nEach connector type wraps a different kind of backend as MCP tools. Full config schemas, field references, and examples live in ** connectors.md**.\n\n| Connector | Status | What it wraps | Tool discovery |\n|---|---|---|---|\n`http` |\n\n`graphql`\n\n`grpc`\n\n`.proto`\n\n)`mcp`\n\n`cli`\n\n`file`\n\n`sql`\n\n`mongodb`\n\nExperimental connectors are functional, but their config schema and behaviour may change in future releases.\n\nAll credentials read from environment variables — `heku auth setup`\n\nwrites them to `.env`\n\n, and nothing ever travels over the MCP protocol.\n\n| Type | Header |\n|---|---|\n`bearer` |\n`Authorization: Bearer {token}` |\n`basic` |\n`Authorization: Basic base64(user:token)` |\n`api_key` |\nCustom header, e.g. `X-API-Key` |\n`oauth2_static` |\nPre-acquired OAuth2 access token |\n\n```\n{ \"type\": \"bearer\",       \"token_env\": \"GITHUB_TOKEN\" }\n{ \"type\": \"api_key\",      \"key_env\": \"MY_KEY\", \"header_name\": \"X-Api-Key\" }\n{ \"type\": \"basic\",        \"username_env\": \"MY_USER\", \"token_env\": \"MY_PASS\" }\n{ \"type\": \"oauth2_static\",\"token_env\": \"MY_OAUTH_TOKEN\" }\nheku start [config-dir]      Start the MCP server (stdio by default)\n                             Flags: --http, --port <n>, --debug\n\nheku list [service]          List loaded configs + auth status\nheku auth                    Check or set up credentials interactively\nheku auth status             Show per-service auth health\nheku auth setup [service]    Walk through env-var setup, write to .env\n\nheku login                   Authenticate with the registry\nheku logout                  Clear stored registry credentials\n\nheku install <target>        Install a config from the registry\n                             Target: @ns/slug or @ns/slug@version\nheku uninstall <target>      Remove an installed registry config\nheku publish [file]          Publish a local config to the registry\nheku fork <namespace/slug>   Fork a published config into your namespace\n\nheku discover                Scan Claude Desktop / Cursor for MCP servers\nheku update                  Update heku to the latest version\nheku help                    Show usage\n```\n\nStart with the console UI:\n\n```\nheku start --http --port 3456\n```\n\nThen open ** console.rapidthoughtlabs.space** and connect to\n\n`http://localhost:3456`\n\n.The dashboard is a React + Vite app — available hosted at ** console.rapidthoughtlabs.space** or embedded when you run\n\n`heku start --http`\n\n.**Chat**— test tools through a model of your choice (OpenAI, Together AI)** Configs**— visual editor for connector and tool definitions** Prompts**— inspect the system prompt layers and token counts** Registry**— browse, install, and publish configs** Auth**— credential status across all configs at a glance\n\n** app.rapidthoughtlabs.space** is the default registry for sharing configs — browse community connectors, install with one command, and publish your own.\n\n```\nheku install @rtl/github\nheku install @rtl/slack@1.2.0\nheku publish mcp-configs/mcp.stripe-http.json\n```\n\nUse `--registry <url>`\n\nto point at a self-hosted registry.\n\nDrop `heku.config.json`\n\nin your config directory:\n\n```\n{\n  \"log_level\": \"info\",\n  \"rate_limits\": {\n    \"github-http\": { \"requests_per_minute\": 60 }\n  },\n  \"self_config\": true\n}\ngit clone https://github.com/RapidThoughtLabs/heku\ncd heku\nnpm install\n\nnpm run dev          # client (5173) + console server (3456) in parallel\nnpm run dev:mcp      # MCP stdio server only — for testing with Claude Desktop\nnpm run build        # bundle CLI to dist/cli.js via tsup\nnpm run typecheck    # tsc --noEmit\nnpm test             # vitest\nsrc/             MCP server core (CLI, connectors, auth, loader, executor)\nserver/          Express backend for the console UI\nclient/          React + Vite dashboard\nprotos/          Example .proto files for gRPC connector testing\nscripts/         Registry seed scripts\nmcp-configs/     Local config files (gitignored)\n```\n\nTypeScript · Node.js (ESM) · `@modelcontextprotocol/sdk`\n\n· Express · React 19 · Vite · Zustand · `@grpc/grpc-js`\n\n· GraphQL · tsup · Vitest\n\n**Response stripping**— every tool response is structurally trimmed before it reaches the model. Base64 blobs become size markers, null/empty fields are dropped, strings over 8 000 chars are head-truncated, and arrays over 100 items are capped. Structure-only — never decides which field matters.\n\n- Renamed meta-tool namespace from\n`mcp.one.*`\n\nto`heku.*`\n\nacross all connectors, prompts, and client code - Fixed deployed console manifest style switcher (settings API calls now use the correct bridge base URL)\n- Fixed prompt page config catalog not refreshing when heku connects after page load\n- Markdown rendering in the demo chat — assistant responses now render formatted text\n- Config catalog descriptions now show in composed prompt preview; falls back to display name when description is absent\n- Dual manifest preview in Prompts page — flat and namespaced styles with separate token counts\n- heku server version now reads from\n`package.json`\n\nat runtime in dev mode instead of showing`0.0.0-dev`\n\n- Registry versioning overhaul — semver-based publish/install flow\n- CLI registry commands:\n`install`\n\n,`uninstall`\n\n,`fork`\n\n,`publish`\n\n- Console registry browser tab\n\n- SQL and MongoDB connector types (experimental)\n- Config write lock — block LLM agents from mutating configs\n- Hot-reload watcher improvements\n\n[@ruchitnannavare](https://github.com/ruchitnannavare)— creator & maintainer[@SayanSwaroopROy](https://github.com/SayanSwaroopROy)\n\nApache License 2.0 — see [LICENSE](/RapidThoughtLabs/heku/blob/main/LICENSE).", "url": "https://wpnews.pro/news/show-hn-heku-dynamic-mcp-tooling-via-json-configs", "canonical_source": "https://github.com/RapidThoughtLabs/heku", "published_at": "2026-06-24 13:55:24+00:00", "updated_at": "2026-06-24 14:10:09.915211+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "large-language-models", "ai-agents"], "entities": ["RapidThought Labs", "Heku", "MCP", "GitHub", "Slack", "Linear", "Node.js"], "alternates": {"html": "https://wpnews.pro/news/show-hn-heku-dynamic-mcp-tooling-via-json-configs", "markdown": "https://wpnews.pro/news/show-hn-heku-dynamic-mcp-tooling-via-json-configs.md", "text": "https://wpnews.pro/news/show-hn-heku-dynamic-mcp-tooling-via-json-configs.txt", "jsonld": "https://wpnews.pro/news/show-hn-heku-dynamic-mcp-tooling-via-json-configs.jsonld"}}