Brawler MCP Server (Python)
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Brawler MCP Server (Python)show me the context tools for this agent"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Brawler MCP Server (Python)
FastMCP wrapper that tags tools with agent tasks so a client can list and run context, completion, evaluation, post, skill, and none tools from one MCP server.
This is not a fork of FastMCP. It depends on FastMCP 4 and subclasses FastMCP. Later language ports (brawler-mcp-server-typescript, and so on) should implement the same wire contract.
Brawler agents attach one MCP server as a resource, then fetch tools by task: context tools build the prompt, completion tools are offered to the model, post and eval tools run after a result, skill tools inject or load instructions.
What this adds on top of FastMCP
FastMCP | This package |
| Same decorator, stamped as completion |
No task model |
|
Tags are optional | Every task decorator sets a task tag and |
| Clients filter by |
Untagged tools from a plain FastMCP server are treated as completion by Brawler. Tools from this package always carry an explicit task.
Related MCP server: Enterprise MCP Gateway and Tool Registry
Install
uv add brawler-mcp-server-python
# or
pip install brawler-mcp-server-pythonRequires Python 3.10+ and FastMCP 4.1.3+.
Quick start
from brawler_mcp_server import BrawlerMCP
mcp = BrawlerMCP('Docs')
@mcp.context_tool
def policies() -> str:
"""Injected into the agent system prompt."""
return 'Always cite sources.'
@mcp.context_tool(as_user_message=True)
def ticket() -> str:
return 'Ticket #123 is still open.'
@mcp.tool
def search(q: str) -> str:
"""Completion tool offered to the model."""
return f'Results for {q}'
@mcp.eval_tool
def grounded(answer: str) -> tuple[bool, float, str | None]:
if not answer.strip():
return False, 0.0, 'Answer is empty.'
return True, 1.0, None
@mcp.post_tool
def audit(answer: str) -> None:
return None
@mcp.skill_tool(mode='always-on')
def style() -> str:
return """---
name: style
description: Prefer short sentences.
---
# Style
Use short sentences.
"""
@mcp.none_tool
def ping() -> str:
"""Visible to generic MCP clients; Brawler agents ignore none tools."""
return 'pong'
if __name__ == '__main__':
mcp.run()mcp.run() speaks stdio by default. Use FastMCP HTTP transports when you need a remote endpoint.
Example server shipped with this package:
uv run brawler-mcp-exampleWire contract
MCP tools/list has no task filter. Identity lives on each tool so any language client can list a subset after listing.
{
"name": "policies",
"description": "Injected into the agent system prompt.",
"_meta": {
"mcp_server": {
"task": "context",
"as_user_message": false
},
"fastmcp": {
"tags": ["context"]
}
}
}_meta.mcp_server
Field | Type | When |
|
| Always |
|
| Context only. |
|
| Skill only. Always-on content is injected with context; auto skills are loaded by name. |
FastMCP also copies the task into _meta.fastmcp.tags. Clients may use either field. If both are missing, treat the tool as completion.
Listing only context tools
from fastmcp import Client
from brawler_mcp_server import tools_for_task
async with Client(mcp) as client:
tools = await client.list_tools()
context_tools = tools_for_task(tools, 'context')In-process (no MCP round-trip):
context_tools = await mcp.tools_by_task('context')Return types
Decorator | Python return | On the wire |
|
| Single text content |
|
| JSON |
|
| Empty / ignored text |
| FastMCP default | FastMCP default |
Decorators check the annotation at registration time.
Agent tasks (this package)
Router and training are not included. Those are not function-tool tasks on a Brawler agent.
Task | Decorator | Agent use |
|
| Prompt / user-message injection |
|
| Model-callable tools |
|
| After the final result |
|
| Side effects after the result, before eval |
|
| Always-on context or auto |
|
| Not used by Brawler agents |
Using with Brawler
Register the server as an MCP resource on an agent the same way as any other MCP connection (MCPTool.from_server / agent.mcp(...) / POST /mcps). The persisted row stays entity_type=mcp with task=completion (the connection). Remote tools carry the task in _meta.mcp_server.
At run time the agent lists tools, keeps completion tools for the model, and calls context / skill / post / eval tools at the matching pipeline stage.
Development
uv sync --all-extras --group lint --group dev
make test
make typecheckLicense
Apache-2.0
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.
Related MCP Servers
- FlicenseBqualityDmaintenanceA Model Context Protocol server framework featuring dynamic tool loading and automatic tool discovery from a dedicated directory. It leverages FastMCP to provide a robust environment for building, configuring, and testing individual Python-based tools.1-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to discover and execute tools via a secure MCP server with JWT authentication, RBAC, rate limiting, and audit logging.1MIT
- AlicenseAqualityDmaintenanceAggregates tools from multiple MCP servers, acting as a proxy to provide unified access to various AI agents and tools.1014 npm3MIT
- AlicenseNot gradedqualityAmaintenanceProvides a single MCP endpoint that dynamically discovers, routes, policy-checks, and executes hundreds of MCP tools from any agent, with optional LLM-based routing.4 npm1Apache 2.0