PromptisePromptise
Docs
GitHub
promptise
[n.02/07]> MCP

Give AI agents safe, governed access to your systems.

Agents are only as useful as the systems they can reach, and every connection is a security question. Promptise MCP exposes your tools over the open Model Context Protocol with authentication, permissions, rate limits and an audit trail from the first request.

GitHub
clientmcp serverauthscopesmiddlewarelist_ordersget_orderrefunddenied
Every call passes authentication, scope checks and your middleware before it reaches a tool. A caller without the right scope is stopped before the tool runs.
[n.01/07]> what it is

Expose your tools once, to every MCP-compatible agent.

Promptise gives you both sides of the wire: a server framework where one decorator brings authentication, authorization, rate limiting and audit logs, and a native client that discovers tools from any MCP server and hands them to your agent.

Without

Raw tools on the network

You expose bare MCP tools with no auth, no rate limiting and no audit trail. Any agent that can reach the server can call anything on it.

With MCPServer

One decorator, a real server

@server.tool() builds the schema from your type hints. Auth, guards, rate limits, circuit breakers and audit logs stack as middleware, and every handler can receive a typed RequestContext.

In the box

What ships with it

JWT, OAuth and API key auth, per-tool role and scope guards, composable middleware, a job queue, HMAC-chained audit logs, a live dashboard, routers, OpenAPI import and three transports (stdio, HTTP, SSE).

[n.02/07]> developer experience

Turn a function you already have into an agent tool.

Tools are plain async functions. The schema comes from your type hints, and the decorator wires in authentication, authorization, dependencies and middleware — no plumbing.

[01]

Typed RequestContext

The authenticated client, claims, scopes and session state, available to every handler.

ctx
[02]

Routers and namespaces

Group tools behind a prefix, with shared auth and middleware.

MCPRouter
[03]

Dependency injection

Depends() with generator cleanup.

Depends
[04]

Tool versioning

Several versions side by side; clients pin or float.

versions
[05]

Session state

Per-client storage that lasts across tool calls.

sessions
secure_tool.pypython
from promptise.mcp.server import (    HasRole, HasScope, RequestContext,) @server.tool(    auth=True,    guards=[HasRole("analyst"), HasScope("read")],    rate_limit="60/min",)async def revenue_report(    ctx: RequestContext, quarter: str, year: int,) -> dict:    """Get quarterly revenue data."""    return await db.query(quarter, year)
routers.pypython
from promptise.mcp.server import MCPRouter users = MCPRouter(prefix="users") @users.tool()async def search(name: str) -> list[dict]: ... server.include_router(users)  # users_search
[n.03/07]> security

Every call authenticated, authorized and on the record.

Authentication plugs into the infrastructure you already run. Every call goes through the same four steps, and the last one leaves an audit entry.

[01]

Authenticate

JWT bearer, API key or OAuth identifies the caller.

[02]

Authorize

Role and scope guards decide whether this caller may use this tool.

[03]

Execute

Only then does your tool run, behind rate limits and timeouts.

[04]

Audit

The call is written to an HMAC-chained log that shows tampering.

// 001

JWT bearer

JWTAuth for HS256 and AsymmetricJWTAuth for RS256 or ES256, with JWKS support and token caching.

JWTAuthJwksAuth
// 002

OAuth 2.0

Client credentials grant, with an optional built-in token endpoint for development and tests.

client credentials
// 003

API keys

Timing-safe comparison, with roles and metadata attached to each key.

APIKeyAuth
[n.04/07]> guarantees

A mistake in one layer does not become an incident.

Beyond your own guards, the HTTP transport makes a few guarantees so a mistake in one layer does not become an incident.

// 001

Identity per request

Headers, claims and request id come from the call being handled, not the request that opened the session. A caller cannot inherit another’s identity by reusing a session id.

// 002

Sessions bound to a credential

With authentication on, a session belongs to the credential that opened it. Presenting a different one does not get you in.

// 003

Host and Origin validated

A server bound to loopback rejects foreign Host or Origin headers, so a web page cannot reach it through DNS rebinding. Behind a proxy, allow the hostname explicitly.

// 004

Approval gates

Gate any tool with requires_approval. The client’s user is asked through elicitation, or a second person of the same tenant decides, with caps on how much can be parked.

[n.05/07]> operations

Built to run in production, not just in a demo.

Resilience, observability, background work, spec import and testing. Pick one to see what it gives you.

[01] Resilience

Fail in one place, not everywhere.

Protective middleware sits in front of your tool logic. A circuit breaker stops a failing dependency from taking the rest of the server with it, timeouts bound every call, and rate limits cap what any one client can do.

What you get
  • Circuit breakers
  • Per-client and per-tool rate limits
  • Timeouts on every call
  • Response caching, in memory or Redis
middleware.pypython
from promptise.mcp.server import (    AuthMiddleware, JWTAuth,    RateLimitMiddleware,) auth = AuthMiddleware(JWTAuth("secret"))limit = RateLimitMiddleware(rate_per_minute=100)server.add_middleware(auth)server.add_middleware(limit)
[n.06/07]> the agent’s view

Agents see a clean interface, never your code.

An agent never sees your code. It sees a tool name, a description and a typed parameter schema, all generated from the function you wrote.

you writepython
@server.tool()async def search_users(    name: str,    department: str = "all",) -> list[dict]:    """Find employees by name."""    return await db.search(name, department)
the agent receivesjson
{  "name": "search_users",  "description": "Find employees by name.",  "inputSchema": {    "type": "object",    "properties": {      "name": { "type": "string" },      "department": { "type": "string", "default": "all" }    },    "required": ["name"]  }}
[n.07/07]> growth path

Start with one tool and grow without a rewrite.

The same server goes from one tool to a full surface. Each step adds a feature, not a new framework.

// 001

One tool

A single decorator and no configuration. Agents can connect straight away.

@server.tool()
// 002

Ten tools

Routers group tools by domain, and a prefix keeps the names clean.

MCPRouter(prefix="users")
// 003

A production server

Add auth, rate limits and a job queue as middleware around the same tools.

server.add_middleware(...)
// 004

An existing API

Import an OpenAPI spec so a whole REST surface becomes tools.

OpenAPIProvider("openapi.json")
CapabilityHow you use it
Schema from Python type hints@server.tool()
JWT, OAuth and API key authAuthMiddleware(JWTAuth(...)) · APIKeyAuth
Per-tool role and scope guardsguards=[HasRole(...), HasScope(...)]
Rate limitingrate_limit="60/min" · RateLimitMiddleware
Circuit breakers and timeoutsCircuitBreakerMiddleware · TimeoutMiddleware
HMAC-chained audit logAuditMiddleware
Background job queueMCPQueue(server, max_workers=4)
OpenAPI to MCP importOpenAPIProvider("openapi.json")
In-process testingTestClient(server)
Dependency injection and routersDepends() · MCPRouter(prefix=...)
  • Transports: stdio, HTTP and SSE, selected with a flag when you serve.
  • Everything above is optional. A server with one decorated function is a complete server.

Build your first tool API in a minute.

pip install promptise, write one decorated function, then run: promptise serve my_tools:server --transport http --port 8080

Read the docsStep-by-step guide
Promptise - AI Framework LogoPromptise

The foundation layer for agentic intelligence. Build, secure and operate autonomous AI systems with Promptise Foundry.

pip install promptise

[01] Foundry

  • MCPcast
  • The Promptise Agent
  • Reasoning Engine
  • MCP
  • Agent Runtime
  • Prompt Engineering
  • Execution Engine
  • Agent Identity

[02] Resources

  • Documentation
  • GitHub
  • Guides
  • Learning Paths
  • Questions

[03] Company

  • About
  • Terms of Service
  • Privacy Policy
  • Cookie Policy
  • Subprocessors

© 2026 Promptise by Manser Ventures. All rights reserved.

Open source · Python