A smart, unified API for accessing Model Context Protocol (MCP) tools through Groq's Responses endpoint. Features AI-powered tool selection, dynamic MCP registry integration, and zero-configuration tool access.
- 🤖 AI Tool Selection — Let AI automatically choose the best tools for your queries
- 🌐 Universal MCP Access — Access any MCP tool from the official registry without configuration
- 📝 Dynamic Documentation — Auto-generated examples based on actual available tools
- 🔑 Per-Tool API Keys — Bring your own keys for each MCP tool
- 🚀 Browser-Friendly — GET requests with query parameters for easy testing
- ⚡ Multiple Tool Support — Execute multiple MCP tools in one request
- 🔧 Smart Registry — Local tools + automatic fallback to public MCP registry
-
Install Deno: https://deno.land/#installation
-
Set environment variables:
export GROQ_API_KEY="your_groq_api_key"
export PARALLEL_API_KEY="your_parallel_api_key"- Start the server:
deno task serveThis runs: deno serve --allow-sys --allow-read --allow-import --allow-env --allow-write --allow-net --reload=https://esm.town ./main.js
- Open http://localhost:8000 to see the API documentation
Let AI automatically choose the best tools for your query:
# Browser-friendly: AI picks the right tools and executes them
GET /select?q=Plan a 3-day trip to Tokyo
# Generate curl commands for any query
GET /select?q=Find trending AI models&mode=curl
# Programmatic usage with custom API keys
curl -X POST "http://localhost:8000/select" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_GROQ_API_KEY" \
-d '{"query": "Build a travel itinerary for Paris", "mode": "execute"}'When you know exactly which tools to use:
# Execute specific tools
GET /?tools=parallel_web_search&q=what's the weather in San Francisco
# Multiple tools coordination
GET /?tools=github,huggingface&q=research trending AI models and create an issue
# MCP Registry tool (zero configuration)
GET /?tools=garden.stanislav.svelte-llm/svelte-llm-mcp&q=what are svelte runes# List all available tools
GET /?mode=list
# Get detailed tool schemas
GET /?tools=parallel_web_search&mode=list
# Browse the MCP registry
GET /registry
# Search for specific tools
GET /registry?search=gmailFor production use, you can provide custom API keys per tool using the POST endpoint:
# Execute with custom API keys for each tool
curl -X POST "http://localhost:8000/" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_GROQ_API_KEY" \
-d '{
"tools": "parallel_web_search,github",
"q": "research latest AI developments and create an issue",
"toolHeaders": {
"parallel_web_search": {
"x-api-key": "USER_PROVIDED_PARALLEL_KEY"
},
"github": {
"Authorization": "Bearer USER_PROVIDED_GITHUB_TOKEN"
}
}
}'
# List tools with custom headers
curl -X POST "http://localhost:8000/" \
-H "Content-Type: application/json" \
-d '{
"mode": "list",
"tools": "parallel_web_search",
"apiKey": "YOUR_GROQ_API_KEY",
"toolHeaders": {
"parallel_web_search": {
"x-api-key": "USER_PROVIDED_PARALLEL_KEY"
}
}
}'Key Features:
- Bring Your Own Keys: Users can provide their own API keys for each MCP tool
- Secure: Keys are used per-request, not stored
- Priority: User-provided keys override environment variables
- Flexible: Mix environment keys with user keys as needed
GET/POST /select — AI automatically chooses the best tools for your query
| Parameter | Description | Default | Required |
|---|---|---|---|
q or query |
Your natural language query | - | Yes |
mode |
execute or curl |
execute |
No |
model |
Groq model to use | openai/gpt-oss-120b |
No |
{
"query": "Your natural language query",
"mode": "execute", // or "curl"
"model": "openai/gpt-oss-120b"
}Examples:
# Let AI pick tools and execute
GET /select?q=Plan a trip to Tokyo
# Generate curl command
GET /select?q=Find trending AI models&mode=curl
# Programmatic usage
POST /select {"query": "Search for emails about project", "mode": "execute"}GET/POST / — Execute specific tools when you know what you need
| Parameter | Description | Default | Required |
|---|---|---|---|
tools |
Comma-separated tool names | - | For execute mode |
q |
Query/input for tools | - | For execute mode |
mode |
execute or list |
execute |
No |
model |
Groq model | openai/gpt-oss-120b |
No |
```json
{
"tools": "tool1,tool2", "q": "Your query", "mode": "execute", "toolHeaders": { "tool1": {"x-api-key": "YOUR_KEY"} } }
### 🔧 Other Endpoints
- **`GET /registry`** — Browse official MCP registry with search
- **`POST /api/tool/:toolName`** — Individual tool execution (supports MCP registry)
- **`GET /debug`** — Environment and configuration check
- **`POST /api/groq/responses`** — Direct Groq API wrapper
## 🌐 Universal MCP Access
One of the most powerful features is **zero-configuration access** to any MCP tool from the official registry:
```bash
# Use any MCP tool without setup - automatically discovered from registry
GET /?tools=garden.stanislav.svelte-llm/svelte-llm-mcp&q=what are svelte runes
GET /?tools=com.peek/mcp&q=plan a 3-day tokyo itinerary
GET /?tools=ai.waystation/gmail&q=search for emails about the project
# Or let AI pick the perfect tool automatically
GET /select?q=I need help with Svelte development
How it works:
- Local Registry First — Checks your configured tools
- MCP Registry Fallback — Automatically searches 300+ public MCP tools
- Smart Matching — Finds tools by exact name or fuzzy matching
- Zero Config — Works immediately without setup
Tools are registered in the toolsRegistry object in main.js. Each tool can include optional _meta for better documentation and examples:
const toolsRegistry = {
parallel_web_search: {
type: "mcp",
server_label: "parallel_web_search",
server_url: "https://mcp.parallel.ai/v1beta/search_mcp/",
headers: {
"x-api-key": () => Deno.env.get("PARALLEL_API_KEY")
},
require_approval: "never",
// Optional metadata for better dynamic examples
_meta: {
description: "Web search with AI-optimized results",
example_queries: [
"what's the weather in San Francisco",
"latest developments in AI safety research",
"current news about climate change"
],
use_cases: ["Current events", "Research", "Weather", "News"]
}
},
github: {
type: "mcp",
server_label: "GitHub",
server_url: "https://api.githubcopilot.com/mcp/",
headers: {
"Authorization": () => `Bearer ${Deno.env.get("GITHUB_TOKEN")}`
},
require_approval: "never",
_meta: {
description: "GitHub repository management and operations",
example_queries: [
"create an issue in my repo about adding MCP examples",
"search for repositories related to AI",
"create a new issue titled 'Add authentication'"
],
use_cases: ["Create issues", "Manage repos", "Code search", "Pull requests"]
}
},
// Add more tools here...
};- Add your tool configuration to
toolsRegistry - Set required environment variables
- Optionally add
_metafor better documentation - The tool will automatically be available via the API with dynamic examples
Example:
new_tool: {
type: "mcp",
server_label: "new_tool",
server_url: "https://example.com/mcp/",
headers: {
"authorization": () => `Bearer ${Deno.env.get("NEW_TOOL_API_KEY")}`
},
require_approval: "never",
_meta: {
description: "Custom tool for specific operations",
example_queries: [
"primary example query",
"secondary example query",
"tertiary example query"
],
use_cases: ["Use case 1", "Use case 2", "Use case 3"]
}
}The API documentation at / is completely dynamic and generates examples based on:
- Tool metadata (
_meta) if provided - Registry descriptions from dynamically loaded MCP tools
- Smart detection based on tool names and server labels
- Fallback examples for unknown tool types
This means:
- ✅ No hardcoded examples - everything reflects your actual tool registry
- ✅ Automatic updates - adding tools instantly updates documentation
- ✅ Consistent behavior - examples work out of the box
- ✅ Smart defaults - reasonable examples even without metadata
```json
{ "id": "resp_01k5shpe...", "object": "response", "status": "completed", "output": [ { "type": "mcp_call", "server_label": "parallel_web_search", "name": "web_search_preview", "output": "..." }, { "type": "message", "role": "assistant", "content": [...] } ], "usage": {...} }
### Tool Schema Response
```json
{
"mode": "list",
"schemas": [
{
"toolName": "parallel_web_search",
"server_label": "parallel_web_search",
"tools": [
{
"name": "web_search_preview",
"description": "Perform web searches...",
"input_schema": {...}
}
],
"tool_count": 1
}
]
}
| Variable | Description | Required |
|---|---|---|
GROQ_API_KEY |
Groq API key for model access | Yes |
PARALLEL_API_KEY |
Parallel AI API key for web search | For parallel_web_search tool |
GITHUB_TOKEN |
GitHub token for GitHub MCP tool | For github tool |
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.GROQ_API_KEY,
baseURL: "https://api.groq.com/openai/v1",
});
// Single tool example
const response = await client.responses.create({
model: "openai/gpt-oss-120b",
input: "What models are trending on Huggingface?",
tools: [
{
type: "mcp",
server_label: "Huggingface",
server_url: "https://huggingface.co/mcp",
}
]
});
console.log(response);const response = await client.responses.create({
model: "openai/gpt-oss-120b",
input: "Please create a new issue in my repository called 'build-with-groq/groq-code-cli' with the title 'Add MCP examples' and outline a few examples of MCP?",
tools: [
{
type: "mcp",
server_label: "GitHub",
server_url: "https://api.githubcopilot.com/mcp/",
headers: {
Authorization: "Bearer <GITHUB_TOKEN>"
}
},
{
type: "mcp",
server_label: "Huggingface",
server_url: "https://huggingface.co/mcp",
}
]
});
console.log(response);const response = await client.responses.create({
model: "openai/gpt-oss-120b",
input: "Research trending AI models and create a GitHub issue summarizing them",
tools: [
{
type: "mcp",
server_label: "GitHub",
server_url: "https://api.githubcopilot.com/mcp/",
headers: { "Authorization": "Bearer <GITHUB_TOKEN>" }
},
{
type: "mcp",
server_label: "Huggingface",
server_url: "https://huggingface.co/mcp"
},
{
type: "mcp",
server_label: "parallel_web_search",
server_url: "https://mcp.parallel.ai/v1beta/search_mcp/",
headers: { "x-api-key": "<PARALLEL_API_KEY>" }
}
]
});- 🤖 AI Tool Selector — GPT-oss-120b automatically chooses optimal tools
- 🌐 Universal Registry — Local tools + dynamic MCP registry integration
- 📝 Dynamic Documentation — Auto-generated examples from tool metadata
- 🔑 Flexible Auth — Per-tool API keys with environment fallback
- ⚡ Smart Router — Context-aware endpoint handling
/select?q=X→ AI picks tools and executes/?tools=X&q=Y→ Direct tool execution/?mode=list→ Tool discovery and schemas- No parameters → Dynamic API documentation
- Unknown tools → Automatic MCP registry lookup
The API provides detailed error messages with helpful examples:
- 401 Unauthorized — Missing or invalid API keys
- 404 Not Found — Tool not found in registry
- 400 Bad Request — Missing required parameters
groq-mcp-nav/
├── main.js # Main server and API logic
├── deno.json # Deno configuration
├── README.md # This file
└── ...
Multiple ways to test and explore:
/→ Interactive API documentation/select?q=your query→ AI-powered tool selection/?tools=tool_name&q=test→ Direct tool execution/?mode=list→ Explore available tools/registry→ Browse 300+ public MCP tools/debug→ Check configuration and API keys
- Deno 1.40+
- Groq API Key (get one at https://groq.com)
- Tool-specific API Keys (e.g., Parallel AI for web search)
- AI-Powered — Uses GPT-oss-120b for intelligent tool selection
- Universal Access — Works with 300+ MCP tools from the official registry
- Zero Config — Most tools work immediately without setup
- Production Ready — Per-tool API keys and secure environment variables
- Browser & API — Designed for both interactive and programmatic usage
Powered by Groq — get your API key at https://groq.com