Skip to main content
Glama

πŸ”Œ AI MCP Toolkit

An MCP (Model Context Protocol) server that exposes AI capabilities β€” two of which call other running services in this portfolio over HTTP, and one self-contained β€” as standardized tools any MCP-compatible client can use directly, including Claude Desktop.

Python MCP Groq Tavily


🎯 What It Does

MCP standardizes how an AI client calls external code. Write a tool once as an MCP server, and any MCP-compatible client β€” Claude Desktop, Claude Code, Cursor β€” can discover and call it, with no client-specific integration work.

This server exposes three tools, two of which are thin clients calling other repos' running FastAPI services over HTTP β€” not reimplementations of similar logic:

web_research   β†’ HTTP call to ai-research-agent's /research/ endpoint (port 8003)
review_pr       β†’ HTTP call to ai-pr-reviewer's /pr-review/ endpoint (port 8004)
explain_concept  β†’ self-contained, calls Groq directly β€” genuinely new, no reuse claim

The distinction matters and is worth being precise about: web_research and review_pr have no logic of their own. If ai-research-agent or ai-pr-reviewer isn't running, those tools fail outright β€” they don't fall back to anything. That failure mode is the proof that this is real cross-service interconnection, not two repos that happen to do similar things.


Related MCP server: Friday MCP Server

πŸ“Έ Screenshots

Running server.py

MCP Inspector β€” tool schemas and live testing MCP Inspector Local dev tool showing all 3 tools auto-discovered from @mcp.tool() decorators, with their generated input/output schemas.

Connected and running in Claude Desktop Claude Desktop connection Settings β†’ Developer β†’ Local MCP servers, showing ai-toolkit with status running.

A real tool call inside a Claude conversation Tool call in action Claude recognizing a request matches the web_research tool, invoking it, and returning a result grounded in live search β€” not its own training data.

Running inter_server_communication.py

Without MCP Inspector β€” PR REVIEW MCP Inspector Claude made a normal call to view the public PR and based on diff gives the suggestion.

With MCP Inspector - PR REVIEW MCP Inspector Now claude made custom mcp tool calls and forwarded the request to ai-pr-reviewer over HTTP and returned the identical structured result.

Side by side, these two screenshots are the actual evidence of cross-service reuse β€” same backend, same output, two different ways of reaching it.


✨ Features

  • Protocol-standard tool exposure β€” built on the official MCP Python SDK (FastMCP)

  • Real cross-repo interconnection β€” web_research and review_pr are HTTP clients of other services in this portfolio, isolated in their own module for clarity

  • Auto-generated schemas β€” tool input/output schemas derive from Python type hints and docstrings

  • Honest dependency, not duplication β€” if a backing service is down, its tool fails; nothing is silently reimplemented as a fallback

  • Client-agnostic β€” works with Claude Desktop, Claude Code, MCP Inspector, or any future MCP client unchanged


πŸ—οΈ Architecture

Claude Desktop (or any MCP client)
        β”‚  stdio + MCP protocol
        β–Ό
server.py  (FastMCP β€” tool registration, schema generation)
        β”‚
        β”œβ”€β”€ explain_concept ──────────────► Groq directly (no other service)
        β”‚
        └── inter_server_communication.py
                β”œβ”€β”€ web_research ─── HTTP ──► ai-research-agent  (port 8003)
                └── review_pr     ─── HTTP ──► ai-pr-reviewer     (port 8004)

inter_server_communication.py is a separate module specifically because it carries the cross-service dependency β€” keeping it isolated from server.py makes the "this tool depends on another repo being up" relationship explicit and easy to point to, rather than buried inside tool definitions.


🧠 How It Works

server.py registers tools with @mcp.tool(). Two of those tools don't contain business logic β€” they import functions from inter_server_communication.py, which makes an HTTP POST to another repo's running FastAPI service and returns its response, reshaped into a readable string for the MCP client.

# inter_server_communication.py
def call_research_agent(topic: str, depth: str = "quick") -> str:
    response = httpx.post(
        f"{RESEARCH_AGENT_URL}/research/",
        json={"topic": topic, "depth": depth},
        timeout=120
    )
    response.raise_for_status()
    data = response.json()
    findings = "\n".join(f"- {f}" for f in data.get("key_findings", []))
    return f"{data.get('summary', '')}\n\nKey findings:\n{findings}"
# server.py
@mcp.tool()
def web_research(topic: str, depth: str = "quick") -> str:
    """Run the ai-research-agent service's autonomous web research agent on a topic."""
    return call_research_agent(topic, depth)

When Claude calls review_pr with a GitHub PR URL, the request goes: Claude β†’ MCP server β†’ inter_server_communication.py β†’ HTTP β†’ ai-pr-reviewer's /pr-review/ endpoint β†’ GitHub API (to fetch the diff) β†’ Groq (to generate the review) β†’ back through the same chain to Claude. Five hops, three repos, one conversational request.


πŸ—‚οΈ Project Structure

ai-mcp-toolkit/
β”œβ”€β”€ server.py                        # Tool registration, FastMCP entry point
β”œβ”€β”€ inter_server_communication.py    # HTTP clients for ai-research-agent and ai-pr-reviewer
β”œβ”€β”€ .env.example
└── .gitignore

πŸš€ Getting Started

Prerequisites

Installation

git clone https://github.com/vyavahare-kishor/ai-mcp-toolkit
cd ai-mcp-toolkit

curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv
source .venv/bin/activate
uv add "mcp[cli]" httpx groq python-dotenv

Configuration

cp .env.example .env
GROQ_API_KEY=your_groq_api_key_here
RESEARCH_AGENT_URL=http://localhost:8003
PR_REVIEWER_URL=http://localhost:8004

Run the dependent services first

# Terminal 1 β€” ai-research-agent
cd ai-research-agent && uvicorn main:app --reload --port 8003

# Terminal 2 β€” ai-pr-reviewer
cd ai-pr-reviewer && uvicorn main:app --reload --port 8004

Test locally β€” MCP Inspector

uv run mcp dev server.py

# for cross server testing
uv run mcp dev inter_server_communication.py

Try review_pr with a real public GitHub PR URL while watching ai-pr-reviewer's terminal β€” you should see the incoming request logged there, confirming the call actually crossed into that repo.

Connect to Claude Desktop

{
  "mcpServers": {
    "ai-toolkit": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/ai-mcp-toolkit", "run", "server.py"]
    }
  }
}

# for cross server testing
{
  "mcpServers": {
    "ai-toolkit": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/ai-mcp-toolkit", "run", "inter_server_communication.py"]
    }
  }
}

Restart Claude Desktop, then ask: "Use review_pr to review this PR: [github PR url]"


πŸ—ΊοΈ Roadmap

  • Wrap ai-customer-support-bot's /support/ask as a 4th cross-service tool

  • Add a fallback message (not silent failure) when a dependent service is unreachable

  • Add an MCP resource exposing recent research/review history

  • Authentication for remote deployment beyond local stdio


Part of an AI-native engineering portfolio. Full journey: ai-engineering-journey

Project

Relationship to this one

ai-research-agent

web_research calls this repo's /research/ endpoint directly over HTTP β€” a real runtime dependency

ai-pr-reviewer

review_pr calls this repo's /pr-review/ endpoint directly over HTTP β€” same dependency relationship

ai-analyst-crew

Same Groq backend pattern, but no cross-service calls β€” useful contrast


πŸ‘¨β€πŸ’» Author

Kishor Vyavahare Senior Software Engineer β†’ AI Native Engineer

11+ years of backend engineering (Ruby on Rails, PostgreSQL, AWS). Now building production AI systems β€” RAG pipelines, agents, multi-agent crews, and protocol-standard tool exposure with real cross-service architecture.

LinkedIn GitHub


πŸ“„ License

MIT License β€” use it, fork it, build on it.

Available Tools

3 tools
explain_conceptA

Explain a technical or AI concept tailored to a specific audience's background level, using concrete analogies.

ParametersJSON Schema
NameRequiredDescriptionDefault
conceptYes
audienceNoa senior backend engineer new to AI

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions using concrete analogies but lacks disclosure of any side effects, authorization needs, or limitations. Behavioral traits are minimally covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the key action and purpose. However, it could be slightly more structured to include additional context without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with only two simple parameters and an output schema (not shown), the description adequately covers the main functionality. It might miss details about edge cases or format, but overall it is sufficient for an AI to understand usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by indicating that 'audience' should specify background level and that the explanation uses analogies. This adds meaning beyond the schema's bare parameter names and types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'explain', resource 'technical/AI concept', and specifies tailoring to audience background with concrete analogies. It distinctly differentiates from sibling tools like review_code_diff and web_research.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when explaining concepts to a specific audience, but it does not provide explicit guidance on when not to use or how it compares to alternatives. No when/when-not statements are included.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_code_diffA

Review a code diff and return structured, actionable feedback. Pass raw diff text. Optionally specify a focus area like 'security'.

ParametersJSON Schema
NameRequiredDescriptionDefault
diffYes
focusNobugs and code quality

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description must fully convey behavioral traits. It mentions 'structured, actionable feedback' but does not describe what structure, any limitations, or side effects. Lacks details on return format, performance, or error handling, leaving agents uninformed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, no wasted words. It is direct and front-loaded with the primary purpose, followed by usage instructions. Highly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, 1 required, output schema existing), the description covers the core usage adequately. It could mention handling of invalid diffs or output format, but the output schema likely fills that gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds meaning: 'Pass raw diff text' clarifies the diff parameter's content, and 'Optionally specify a focus area like 'security'' gives an example for the focus parameter. This compensates well for the missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Review a code diff') and the expected output ('structured, actionable feedback'). It is specific and distinguishes the tool from siblings (explain_concept, web_research) which have different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description instructs to 'Pass raw diff text' and optionally specify a focus area. This provides clear input guidance. While it doesn't explicitly state when to use vs. siblings, the tool's unique purpose (code review) makes it evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_researchA

Search the web for current information on a topic and return a concise summary with key points drawn from the results.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must cover behavioral traits. It only mentions the output format (concise summary with key points) but does not disclose important behaviors like data freshness, source reliability, error handling, rate limits, or any side effects. For a data-fetching tool, this is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that efficiently conveys the action, input, and output. No extraneous words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no annotations, has output schema), the description is largely complete. It could be slightly improved by hinting at the output structure or that results are drawn from live web data, but overall it provides sufficient context for an agent to understand the tool's basic function.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has only one parameter 'topic' with 0% description coverage. The description adds meaning by explaining that the tool searches for current information on a 'topic', clarifying the parameter's purpose beyond the schema's bare type definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (search the web) and the resource (current information on a topic) with a specific output (concise summary with key points). It distinguishes itself from sibling tools like 'explain_concept' and 'review_code_diff' by focusing on web search and summarization.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, such as when to search the web versus using other research or explanation tools. No exclusions or prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.0
    • First observedexplain_concept
    • First observedreview_code_diff
    • First observedweb_research

TDQS

A3.6/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a completely different functionβ€”concept explanation, code review, and web researchβ€”with no overlap in purpose or inputs. An agent would not confuse them.

Naming Consistency3/5

Two tools follow a clear verb_noun pattern (explain_concept, review_code_diff), but web_research reverses the order (noun_verb if 'research' is the verb) or could be read as noun_noun, breaking consistency.

Tool Count3/5

With only 3 tools, the server feels minimal for a general-purpose AI toolkit. While the count itself is acceptable, the scope is too narrow to be considered well-rounded.

Completeness2/5

The tools are a random collection with no domain coherence. Missing fundamental AI capabilities like text generation, summarization, or image analysis, making the surface severely incomplete for a toolkit.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers