MCP (Model Context Protocol) server for HawkAPI — auto-exports routes as agent tools
Project description
hawkapi-mcp
MCP (Model Context Protocol) server for HawkAPI. Auto-exports every route as an agent tool — any MCP-compatible client can call your API.
Install
pip install hawkapi-mcp
Quickstart
from hawkapi import HawkAPI
from hawkapi.responses import JSONResponse
from hawkapi_mcp import mount_mcp
app = HawkAPI()
@app.get("/users/{user_id:int}")
async def get_user(user_id: int) -> JSONResponse:
return JSONResponse({"id": user_id, "name": "Alice"})
@app.post("/items")
async def create_item(body: dict) -> JSONResponse:
return JSONResponse({"created": body})
mount_mcp(app) # serves POST /mcp
Point any MCP-compatible client at http://your-host/mcp. Every HawkAPI route becomes a tool — its operationId is the tool name, the OpenAPI schema becomes the input schema.
Tool naming
| Route definition | Generated tool name |
|---|---|
@app.get("/users/{id}", operation_id="get_user") |
get_user |
@app.get("/users/{id}") (no operation_id) |
get_users_id |
Tool input schema
The decorator combines path / query / header parameters and the JSON request body into a single object schema. Parameter names are namespaced so they cannot collide:
| Source | Schema key |
|---|---|
| Path parameter | path.<name> |
| Query parameter | query.<name> |
| Header parameter | header.<name> |
| Cookie parameter | cookie.<name> |
| JSON body | body |
tools/call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_user",
"arguments": {"path.user_id": "42"}
}
}
The tool result has the response body in content[0].text and the raw HTTP status / headers in structuredContent. isError is true for any 4xx/5xx response.
Filtering tools
mount_mcp(app, include_only={"get_user", "create_item"})
mount_mcp(app, exclude={"internal_admin_route"})
Supported JSON-RPC methods
initialize— handshake. Returns the MCP protocol version, server info, and tool capability.ping— keepalive.tools/list— return the tool catalog.tools/call— invoke a tool. Returns response body + HTTP status.notifications/initialized— accepted, no response.
The endpoint accepts both single JSON-RPC objects and batches.
Auth
hawkapi-mcp does not define its own auth layer — wire your HawkAPI middleware (HTTPBearer, OAuth2, API key) on the MCP route just like any other path. Header arguments forwarded by the client land in the request before middleware runs.
Development
git clone https://github.com/ashimov/hawkapi-mcp.git
cd hawkapi-mcp
uv sync --extra dev
uv run pytest -q
uv run ruff check . && uv run ruff format --check .
uv run pyright src/
Specification
Implements a subset of the Model Context Protocol sufficient to advertise and invoke tools. Streamable HTTP transport only — stdio is out of scope (deploy your app behind any ASGI server and the agent connects to the /mcp URL).
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hawkapi_mcp-0.1.0.tar.gz.
File metadata
- Download URL: hawkapi_mcp-0.1.0.tar.gz
- Upload date:
- Size: 21.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d9ba3704cf6e617b76a63c22694271f02dc0711ef0bb79ed10775986ddb04b1
|
|
| MD5 |
20457a4698d39663cbf97f32cd3a421d
|
|
| BLAKE2b-256 |
80e4fd5d4a9525775f0f4cad253494135a7a708cbed35a84af601f297b219478
|
Provenance
The following attestation bundles were made for hawkapi_mcp-0.1.0.tar.gz:
Publisher:
release.yml on ashimov/hawkapi-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hawkapi_mcp-0.1.0.tar.gz -
Subject digest:
0d9ba3704cf6e617b76a63c22694271f02dc0711ef0bb79ed10775986ddb04b1 - Sigstore transparency entry: 1552817663
- Sigstore integration time:
-
Permalink:
ashimov/hawkapi-mcp@b1d8a654e9ba75df00d74e6b5bf5c9f484fe0f31 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ashimov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b1d8a654e9ba75df00d74e6b5bf5c9f484fe0f31 -
Trigger Event:
release
-
Statement type:
File details
Details for the file hawkapi_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hawkapi_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77290878f5f7e73e3ba8726788adcb7094d106fe5ab0cbafe74a7df5e419a46b
|
|
| MD5 |
0315c6ce1a7325ac266992cea7890485
|
|
| BLAKE2b-256 |
b417370b6d4c348cf27b2b93fcfe4bda8f6b62429c96e49b57a77a21c838371e
|
Provenance
The following attestation bundles were made for hawkapi_mcp-0.1.0-py3-none-any.whl:
Publisher:
release.yml on ashimov/hawkapi-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hawkapi_mcp-0.1.0-py3-none-any.whl -
Subject digest:
77290878f5f7e73e3ba8726788adcb7094d106fe5ab0cbafe74a7df5e419a46b - Sigstore transparency entry: 1552817732
- Sigstore integration time:
-
Permalink:
ashimov/hawkapi-mcp@b1d8a654e9ba75df00d74e6b5bf5c9f484fe0f31 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ashimov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b1d8a654e9ba75df00d74e6b5bf5c9f484fe0f31 -
Trigger Event:
release
-
Statement type: