Skip to content
Last9
Book demo

Last9 MCP for AI agents

Connect an AI agent or service to Last9 MCP with bearer authentication and Python examples.

Use Last9’s MCP server to query telemetry from a Python AI agent, such as an incident bot or on-call assistant. For chat in Last9, use AI Assistant. For instructions your coding agent can follow, see agent skills, or see Build your own AI SRE to connect your own bot or investigation service.

Use an MCP client token for programmatic access from agents and services. For IDE setup with browser sign-in, see Last9 MCP and the MCP page in Last9.

Authentication

Two modes are available:

ModeBest forHow it works
Hosted MCP + OAuthDevelopers in IDEsSign in with a Last9 account through the browser
MCP token (Bearer)Agents, services, CI pipelinesGenerate a client token; pass as Authorization: Bearer <token> in every request

Get an MCP token

  1. Open Query Tokens in your Last9 organization.
  2. Click New Token → Token Type: Client → Client Type: MCP
  3. Copy the token and store it in your secrets manager.

The MCP server URL is:

https://app.last9.io/api/v4/organizations/<org_slug>/mcp

Find your organization slug in your Last9 dashboard URL: app.last9.io/v2/organizations/<org_slug>/....

Team token management

ScenarioRecommendation
Developer IDEsUse individual OAuth sign-in.
Shared SRE bot / on-call assistantKeep a separate token for the bot in your secrets manager.
CI pipelines or automation scriptsKeep a separate token for each pipeline so it can be rotated independently.
Multiple team members sharing one tokenUse separate credentials to avoid disrupting everyone when a token is rotated.

Review token access when ownership of a service changes. Rotate a token if someone who had access to it leaves the team.

For questions about rate limits or high-volume agent workloads, contact support@last9.io.

Python agent examples

Anthropic SDK (Claude)

Install anthropic and set ANTHROPIC_API_KEY, ANTHROPIC_MODEL, LAST9_ORG_SLUG, and LAST9_MCP_TOKEN. Choose a Claude model that supports the MCP connector. The example enables two read tools using the current connector beta:

import os
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model=os.environ["ANTHROPIC_MODEL"],
max_tokens=4096,
system="You are an SRE assistant. Investigate issues using Last9 observability data.",
messages=[
{
"role": "user",
"content": "Inspect payment-service errors in production over the last 15 minutes. Report evidence and missing information.",
}
],
mcp_servers=[
{
"type": "url",
"url": f"https://app.last9.io/api/v4/organizations/{os.environ['LAST9_ORG_SLUG']}/mcp",
"name": "last9",
"authorization_token": os.environ["LAST9_MCP_TOKEN"],
}
],
tools=[{
"type": "mcp_toolset",
"mcp_server_name": "last9",
"default_config": {"enabled": False},
"configs": {
"get_service_profile": {"enabled": True},
"get_service_logs": {"enabled": True},
},
}],
betas=["mcp-client-2025-11-20"],
)
print("\n".join(block.text for block in response.content if block.type == "text"))

Expand the tool allowlist to match your investigation. Handle tool failures and incomplete responses before publishing a report.

LangChain / LangGraph

LangChain provides MCP support through langchain.mcp in langchain[mcp]>=1.4.0. The API is in beta. See its MCP migration guide if you use the older langchain-mcp-adapters package.

import asyncio
import os
from fastmcp import Client
from langchain.mcp import MCPAdapter
from langchain.agents import create_agent
async def run_sre_agent(question: str) -> str:
url = f"https://app.last9.io/api/v4/organizations/{os.environ['LAST9_ORG_SLUG']}/mcp"
client = Client(url, auth=os.environ["LAST9_MCP_TOKEN"])
async with MCPAdapter(client) as adapter:
available_tools = await adapter.list_tools()
allowed_names = {"get_service_profile", "get_service_logs"}
tools = [tool for tool in available_tools if tool.name in allowed_names]
agent = create_agent(os.environ["LANGCHAIN_MODEL"], tools)
result = await agent.ainvoke(
{"messages": [{"role": "user", "content": question}]}
)
return result["messages"][-1].content
if __name__ == "__main__":
answer = asyncio.run(
run_sre_agent("Inspect payment-service errors in production over the last 15 minutes. Report evidence and missing information.")
)
print(answer)

Install the required packages:

pip install "langchain[mcp,anthropic]>=1.4.0"

Set LANGCHAIN_MODEL to an anthropic:<model-id> supported by your account, and set ANTHROPIC_API_KEY, LAST9_ORG_SLUG, and LAST9_MCP_TOKEN.

OpenAI Responses API

See Last9 MCP → Using with OpenAI’s Responses API for the OpenAI example with Bearer token auth.

Building an on-call bot

Call an agent from your alert or chat handler with the original question, service, environment, and absolute incident window. Keep each incident’s context separate, set a time and tool-call budget, and return incomplete status when required data is missing.

Before sending a report, check tool errors and separate confirmed findings from possible causes. Keep remediation behind your normal review process. Refer to Build your own AI SRE for the complete design and validation steps.

Key tools for agent workflows

The MCP server exposes all Last9 observability tools. The most useful for agent workflows:

ToolWhat it returns
get_service_performance_detailsLatency p95, error rate, throughput for a service
get_exceptionsAggregated evidence of server-side exceptions
get_service_dependency_graphDependency throughput, response-time, and error metrics
get_apm_service_deviationsRegressions/improvements vs an equal-duration baseline window
get_trace_waterfallBounded parent/child waterfall for one trace with timing/self-time
get_trace_attribute_deviationsAttribute values that differ between slow/fast or error cohorts
get_alertsCurrently firing alert rules and severity
get_logsLogJSON pipeline results, including filtered logs and aggregates
get_service_logsRaw service log lines with severity and body filters
get_service_profileAvailable telemetry signals and context for a service
get_change_eventsRecent deployments and config changes (correlate with incidents)
prometheus_range_queryRun any PromQL expression over your metrics
did_you_meanFuzzy-match entity names to avoid empty results from typos

For the full reference, see Available Tools on the main MCP page.


Troubleshooting

  • 401 Unauthorized

    Check that:

    • The Authorization header is Bearer <token> (not Basic, not the token alone)
    • The token is an MCP-type Client token from Query Tokens.
  • Tools return empty results

    Time-window defaults vary by tool. For example, get_logs defaults to 5 minutes, while an exact trace lookup defaults to 4320 minutes. Pass an explicit window when investigating an incident:

    # In tool parameters passed by the agent
    {"lookback_minutes": 360}

    If the service name returns no results, have the agent call did_you_mean first to resolve the correct name.

  • Rate limit errors

    Each organization has rate limits for its endpoints. Limit concurrent requests across all agent instances using the organization. For workloads with many requests, contact support@last9.io to discuss limits.

Please get in touch with us on Discord or Email if you have any questions.