ToolForge MCP Server

ToolForge MCP Server

Enables AI agents to securely discover, execute, and observe tools with role-based access control and audit logging. Serves tools over MCP stdio and HTTP for integration with Claude Desktop, Cursor, and other clients.

Category
Visit Server

README

<div align="center">

โš’๏ธ ToolForge

Agent Tool Infrastructure & MCP Platform

A production-grade runtime that gives AI agents governed, observable, and secure access to tools.

Python 3.11+ License: Apache 2.0 MCP Protocol Tests CI

</div>


What is ToolForge?

Modern AI agents call tools as raw function calls โ€” with no governance, no observability, and no reliability guarantees. ToolForge fills that gap.

It acts as a secure execution gateway between your AI agent and the outside world, providing a full lifecycle for every tool invocation:

Stage What it does
๐Ÿ” Discover Semantic registry with semver, categories, and full-text search
โœ… Validate Auto-generated JSON Schema from Python type hints via Pydantic v2
๐Ÿ” Authorize Capability-based RBAC permissions checked before every execution
โšก Execute Async-first runtime with timeouts, retries, and sandboxing
๐Ÿ“Š Observe Structured ToolResult โ€” execution ID, latency, retry count, error metadata
๐ŸŒ Expose MCP stdio & HTTP, LangGraph adapter, OpenAI function calling schemas

Architecture

flowchart LR
    subgraph Clients["Clients"]
        A1["๐Ÿค– AI Agent"]
        A2["๐Ÿ–ฅ๏ธ Claude Desktop"]
        A3["โšก Cursor / IDE"]
        A4["๐ŸŒ REST API"]
    end

    subgraph Gateway["ToolForge Gateway"]
        direction TB
        B["๐Ÿ”‘ Auth Layer\nAPI Key ยท JWT"]
        C["๐Ÿ›ก๏ธ RBAC Engine\nRoles ยท Capabilities"]
        D["โฑ๏ธ Rate Limiter\nSliding Window"]
        B --> C --> D
    end

    subgraph Runtime["Execution Runtime"]
        direction TB
        E["๐Ÿ“‹ Input Validation\nJSON Schema ยท Pydantic"]
        F["๐Ÿ”’ Sandbox\nDocker ยท Subprocess"]
        G["๐Ÿ”„ Retry + Timeout\nExponential Backoff"]
        H["๐Ÿ“ฆ ToolResult\nID ยท Latency ยท Error"]
        E --> F --> G --> H
    end

    subgraph Registry["Tool Registry"]
        direction TB
        I["๐Ÿ“š 26 Standard Tools\nSemver ยท Categories"]
        J["๐Ÿ”Ž Semantic Search\nFull-Text + Category"]
        I --- J
    end

    subgraph Infra["Infrastructure"]
        K[("๐Ÿ˜ PostgreSQL\nAudit Logs")]
        L[("โšก Redis\nRate Limits ยท Cache")]
        M["๐Ÿ“ˆ Prometheus\n/metrics exporter"]
    end

    Clients --> Gateway
    Gateway --> Runtime
    Runtime --> Registry
    Runtime --> Infra

Quick Start

Install:

git clone https://github.com/your-username/toolforge
cd toolforge
pip install -e .

Register and execute a custom tool:

import asyncio
from toolforge import ToolForge

tf = ToolForge()

@tf.tool(
    name="calculate_tax",
    description="Calculate income tax for a given gross income and rate.",
    version="1.0.0",
    category="finance",
)
def calculate_tax(income: float, rate: float = 0.2) -> float:
    return income * rate

async def main():
    result = await tf.execute("calculate_tax", {"income": 120_000.0, "rate": 0.28})
    print(result.status.value)       # 'success'
    print(f"${result.result:,.2f}")  # '$33,600.00'
    print(result.execution_id)       # UUID for tracing

asyncio.run(main())

Load all 26 standard tools in one line:

from toolforge import ToolForge
tf = ToolForge.with_standard_tools()

Standard Tool Ecosystem โ€” 26 Tools

Category Tools
๐ŸŒ Web web_search, web_fetch, http_request
๐Ÿ“ Files file_read, file_write, file_search, directory_list
๐Ÿ“Š Data pdf_extract, csv_read, json_transform
๐Ÿ—„๏ธ Database sql_query (read-only guard), sql_schema, redis_get, redis_set
๐ŸŒฟ Git git_status, git_diff, git_log
๐Ÿ™ GitHub github_search, github_file, github_issue, github_actions
๐Ÿ Code python_execute, shell_execute
๐Ÿง  AI embedding_generate, vector_search, rerank

Core Features

Custom Tool Registration

from toolforge import tool, RetryPolicy, StandardCapability

@tool(
    name="fetch_stock_price",
    description="Fetch live stock price from market API.",
    version="1.0.0",
    category="finance",
    capabilities=[StandardCapability.NETWORK.value],
    timeout=10.0,
    retry_policy=RetryPolicy(max_retries=3, initial_delay_sec=0.5),
)
async def fetch_stock_price(ticker: str) -> dict:
    """Fetch stock data for given ticker symbol."""
    return {"ticker": ticker, "price": 185.42}

Structured Tool Results

Every execution returns a fully typed ToolResult โ€” no raw dicts, no guessing:

result = await tf.execute("web_search", {"query": "python asyncio"})

result.execution_id   # UUID โ€” for distributed tracing
result.tool_name      # "web_search"
result.tool_version   # "1.0.0"
result.status         # SUCCESS | FAILED | TIMEOUT | PERMISSION_DENIED
result.result         # structured output
result.error          # ToolErrorInfo(code, message, retryable)
result.duration_ms    # wall-clock latency
result.retry_count    # retries attempted before success
result.unwrap()       # raises RuntimeError on failure, else returns result

Capability-Based Permissions

from toolforge import PermissionContext

ctx = PermissionContext(
    caller_id="research_agent",
    granted_capabilities={"network", "filesystem_read"},
)

# โœ… Tool requires 'network' โ€” succeeds
result = await tf.execute("web_search", {"query": "AI"}, context=ctx)

# โŒ Tool requires 'code_execution' โ€” returns PERMISSION_DENIED, never raises
result = await tf.execute("python_execute", {"code": "..."}, context=ctx)
print(result.status.value)  # 'permission_denied'

MCP Protocol Integration

Expose all 26 tools to Claude Desktop, Cursor, or any MCP-compatible client with zero configuration.

Stdio transport (for Claude Desktop / Cursor):

import asyncio
from toolforge import ToolForge

tf = ToolForge.with_standard_tools()
mcp = tf.create_mcp_server(server_name="my-toolforge")
asyncio.run(mcp.run_stdio())

Or directly via CLI:

python -m toolforge.integrations.mcp

HTTP transport (for remote agents):

# POST /mcp โ€” JSON-RPC 2.0
curl -X POST http://localhost:8000/mcp \
  -H "X-API-Key: tf-..." \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

MCP methods implemented:

Method Description
initialize Capability handshake with client info
tools/list Dynamic schema discovery for all tools
tools/call Executes tool through ToolForge runtime (RBAC + retry)
resources/list Spec-compliant resource listing
prompts/list Spec-compliant prompt listing
ping Heartbeat keepalive

LangGraph & OpenAI Adapters

LangGraph:

tools = tf.to_langgraph_tools()  # List[LangGraphToolWrapper]
# graph = create_react_agent(llm, tools)

Each wrapper supports .invoke() (sync) and .ainvoke() (async) with args_schema for type validation.

OpenAI function calling:

openai_tools = tf.to_openai_tools(category="web")
# โ†’ [{"type": "function", "function": {"name": ..., "parameters": {...}}}]

from toolforge import parse_openai_tool_call
tool_name, args = parse_openai_tool_call(tool_call_obj)
result = await tf.execute(tool_name, args)

Enterprise Security

Initialize the hardened SecuredToolForge client:

from toolforge import SecuredToolForge, Role, RateLimitConfig

tf = SecuredToolForge.with_standard_tools(
    rate_limit_config=RateLimitConfig(requests_per_minute=60),
    circuit_failure_threshold=5,
    circuit_recovery_timeout_sec=30.0,
)

# Issue scoped API keys per role
dev_key  = tf.api_keys.issue_key(user_id="alice", role=Role.DEVELOPER)
agent_key = tf.api_keys.issue_key(user_id="bob",  role=Role.AGENT)

# Execute with key-based auth and RBAC enforcement
result = await tf.execute("python_execute", {"code": "print('hello')"}, api_key=dev_key)

# Query auto-redacted audit events
events = tf.audit.get_events(caller_id="alice")

Security features at a glance:

  • ๐Ÿ”‘ Authentication โ€” SHA-256 hashed API key store + signed JWT bearer tokens
  • ๐Ÿ‘ฅ RBAC Hierarchy โ€” admin > developer > agent > viewer with per-category capability enforcement
  • โฑ๏ธ Rate Limiting โ€” Sliding-window per-user and per-tool limits (in-memory or Redis)
  • ๐Ÿ”Œ Circuit Breaker โ€” CLOSED โ†’ OPEN โ†’ HALF_OPEN protecting against cascading failures
  • ๐Ÿณ Sandboxed Execution โ€” Ephemeral Docker containers (CPU/memory caps, read-only rootfs, no networking); graceful subprocess fallback
  • ๐Ÿ“‹ Audit Logging โ€” Structured JSON events with automatic secret/token redaction

FastAPI Platform Server

Start the server:

uvicorn toolforge.server:app --host 0.0.0.0 --port 8000 --workers 4

Complete REST API:

Method Endpoint Description
GET /health Liveness probe
GET /ready Readiness probe with DB verification
GET /api/v1/tools List tools with search & category filters
GET /api/v1/tools/{name} Full JSON Schema for a specific tool
POST /api/v1/tools/{name}/execute Synchronous tool execution
POST /api/v1/tools/batch Batch execute multiple tools
POST /api/v1/jobs Enqueue async background job
GET /api/v1/jobs/{id} Poll job status & result
POST /api/v1/auth/keys Issue scoped API keys
POST /api/v1/auth/token Issue JWT access tokens
GET /api/v1/audit Query historical execution records
GET /api/v1/metrics JSON metrics summary
GET /metrics Prometheus text exposition format
POST /mcp Remote MCP JSON-RPC 2.0
GET /mcp/sse MCP Server-Sent Events stream

Observability Dashboard

Navigate to http://localhost:8000/ for a live glassmorphism SPA dashboard:

  • ๐Ÿ“Š KPI Metrics Hub โ€” Real-time execution volume, success rates, and p95 latencies
  • ๐Ÿ”Ž Tool Explorer โ€” Searchable grid across all 8 categories with full JSON schema inspector
  • ๐Ÿงช Interactive Playground โ€” Execute any tool live with formatted response and latency benchmarks
  • ๐Ÿ“‹ Live Audit Stream โ€” Execution history with expandable sanitized request/response inspection
  • ๐Ÿ”— MCP Protocol Hub โ€” Connection guides for Cursor & Claude Desktop + JSON-RPC 2.0 tester
  • ๐Ÿ”‘ Security Panel โ€” Issue API keys and JWT tokens directly from the browser

Autonomous Agent Demo

ToolForge ships a built-in Autonomous Repository Debugger that resolves bugs entirely on its own through the secured runtime:

python examples/repo_debugger_agent.py

The agent executes a 6-step autonomous loop:

Step 1  discover   โ†’  directory_list + file_search     find project structure
Step 2  reproduce  โ†’  python_execute                   run failing tests
Step 3  inspect    โ†’  file_read                        read buggy source
Step 4  patch      โ†’  file_write                       apply autonomous fix
Step 5  verify     โ†’  python_execute                   re-run tests โ†’ green
Step 6  report     โ†’  structured summary               root cause + timing

Output:

[REPORT] AGENT RESOLUTION SUMMARY
  Total Steps:   6
  Total Runtime: 249.6ms
  Root Cause:    Unhandled division by zero in calculator.py
  Resolution:    Patched divide() with explicit ValueError guard
  Final Status:  RESOLVED

Production Deployment

Docker Compose (FastAPI Server + PostgreSQL 16 + Redis 7):

docker compose up --build
URL Description
http://localhost:8000/ Web dashboard
http://localhost:8000/docs Swagger / OpenAPI docs
http://localhost:8000/health Health check
http://localhost:8000/metrics Prometheus metrics

CI/CD โ€” GitHub Actions

Every push runs a 4-job pipeline:

Lint (ruff)  โ†’  Test Matrix (3 OS ร— 3 Python)  โ†’  Agent Smoke Test  โ†’  Docker Build
Job Details
Lint ruff check + ruff format --check โ€” fast-fail gate
Test Matrix Ubuntu ยท Windows ยท macOS ร— Python 3.11 ยท 3.12 ยท 3.13 = 9 environments
Agent Demo Full autonomous agent run end-to-end
Docker Build Multi-stage image build with GHA layer cache

Testing

# Run all 86 tests (unit, integration, API, agent)
python -m pytest tests/ -v
86 passed in 6.89s

Project Phases

Phase Status What Was Built
1 โ€” Core SDK โœ… Complete BaseTool, @tool, ToolRegistry, ToolRuntime, Pydantic v2 schemas, retries
2 โ€” Tool Ecosystem โœ… Complete 26 standard tools, MCP stdio server, LangGraph + OpenAI adapters
3 โ€” Security โœ… Complete Docker sandbox, RBAC, API keys, JWT, rate limiter, circuit breaker, audit log
4 โ€” FastAPI + Workers โœ… Complete REST API, PostgreSQL/SQLite, async job queue, MCP HTTP/SSE
5 โ€” Dashboard โœ… Complete Glassmorphism SPA, Prometheus metrics, live playground
6 โ€” Demos & CI/CD โœ… Complete Autonomous agent, Docker Compose stack, GitHub Actions 9-env matrix

Tech Stack

<div align="center">

Python 3.11+ ยท FastAPI ยท Pydantic v2 ยท SQLAlchemy 2.0 ยท PostgreSQL ยท Redis ยท Docker ยท MCP Protocol ยท LangGraph ยท Prometheus

</div>


Contributing

Contributions are welcome. See CONTRIBUTING.md for guidelines.

Built with Python 3.11+, Pydantic v2, FastAPI, SQLAlchemy 2.0, and async-first patterns throughout.


<div align="center"> <sub>Made with โš’๏ธ by the ToolForge team ยท Apache 2.0 License</sub> </div>

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured
E2B

E2B

Using MCP to run code via e2b.

Official
Featured