Integrations¶
Adapters that bridge Tulip to external frameworks, clouds, and vendor APIs.
FastMCP¶
Expose a Tulip agent (or any of its tools) as a Model Context Protocol
server, and consume MCP tools from any compliant client as native
Tulip Tools.
TulipMCPServer ¶
Bases: BaseModel
Exposes a Tulip Agent as an MCP server.
This allows Tulip agents to be used by any MCP-compatible client.
Example
from tulip import Agent from tulip.integrations import TulipMCPServer
agent = Agent(model=model, tools=[...]) server = TulipMCPServer(agent=agent, name="my-agent") server.run() # Starts MCP server
run ¶
Run the MCP server.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
transport
|
Literal['stdio', 'http', 'sse', 'streamable-http']
|
Transport type ("stdio", "http", "sse", or "streamable-http"). |
'stdio'
|
Source code in .sdk/src/tulip/integrations/fastmcp.py
handle_request
async
¶
Handle a single MCP request (for testing).
Source code in .sdk/src/tulip/integrations/fastmcp.py
create_mcp_server ¶
create_mcp_server(agent: Agent, name: str = 'tulip-agent', version: str = '1.0.0') -> TulipMCPServer
Create an MCP server from a Tulip Agent.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
agent
|
Agent
|
Tulip Agent instance |
required |
name
|
str
|
Server name |
'tulip-agent'
|
version
|
str
|
Server version |
'1.0.0'
|
Returns:
| Type | Description |
|---|---|
TulipMCPServer
|
TulipMCPServer instance |
Example
server = create_mcp_server(agent, name="my-assistant") server.run()
Source code in .sdk/src/tulip/integrations/fastmcp.py
mcp_tool_to_tulip ¶
mcp_tool_to_tulip(name: str, description: str, func: Callable[..., Any], parameters: dict[str, Any] | None = None) -> Tool
Convert an MCP-style tool to a Tulip Tool.
When parameters is provided, the JSON Schema is used as-is to
construct the Tool. This preserves the source tool's flat-field
schema end-to-end so the LLM sees the original argument shape
(e.g. {tenant_id, regex, limit}) instead of the generic
{kwargs: …} shape that the @tool decorator would otherwise
derive from the wrapper's **kwargs signature.
When parameters is omitted, falls back to the decorator-derived
schema (parameter-less tool) for backward compatibility.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Tool name |
required |
description
|
str
|
Tool description |
required |
func
|
Callable[..., Any]
|
The async function to call |
required |
parameters
|
dict[str, Any] | None
|
JSON Schema for parameters |
None
|
Returns:
| Type | Description |
|---|---|
Tool
|
Tulip Tool instance |
Source code in .sdk/src/tulip/integrations/fastmcp.py
AWS cloud-posture (read-only)¶
Two generic, spec-driven tools driven by botocore's service models — the
agent discovers the shape of AWS from the spec and runs read-only operations
whose responses become grounded-finding evidence. Read-only by construction:
use_aws refuses any non-read operation before a call is made. See the
cloud-posture agent for the full workflow.
Install the extra: pip install 'tulip-agents[aws]'.
describe_aws ¶
describe_aws(service: str | None = None, operation: str | None = None, region: str | None = None) -> dict[str, Any]
Introspect the AWS API spec (botocore service models).
service is None→{"services": [...]}(all services).serviceonly → that service's read-only operations.service+operation→ the operation's parameter shape.
Source code in .sdk/src/tulip/security/aws.py
use_aws ¶
use_aws(service: str, operation: str, parameters: dict[str, Any] | None = None, region: str | None = None) -> dict[str, Any]
Execute a read-only AWS operation and return the raw response.
Refuses any operation that is not a read verb (see
:data:READONLY_PREFIXES) before making a call. The returned response
is the evidence a grounded finding cites.
Source code in .sdk/src/tulip/security/aws.py
is_readonly_operation ¶
aws_services ¶
The agent-facing @tool wrappers (describe_aws_tool, use_aws_tool) and the
create_soc_analyst factory compose these into
a grounded posture agent.
Vendor integration examples¶
The notebooks ship worked vendor integrations in
examples/integrations/. Each is an ordinary Tulip @tool following
one convention — bring your own credentials: read the vendor key from the
environment and call the live API when it's set, otherwise return a
deterministic offline sample so the example runs with no account. The return
shape is identical either way, so the agent's reasoning doesn't change between
the offline demo and a live deployment.
| Tool | Vendor shape | Credential |
|---|---|---|
enrich_indicator |
VirusTotal / GreyNoise IOC reputation | VT_API_KEY |
query_siem |
Splunk / Elastic log + alert search | SIEM_URL, SIEM_TOKEN |
dispatch_timing_probe |
RunPod / Lambda inference-fingerprint probe | RUNPOD_API_KEY, LAMBDA_API_KEY |
measure_endpoint_timing |
Streaming time-to-first-token / cadence probe | none (uses any reachable endpoint) |
Hand these to a triage agent end-to-end in
live vendor integrations;
the GPU probe grounds into a fingerprint finding in
specialist agents. The
bring-your-own-credentials contract is documented in
examples/integrations/README.md.