<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dapr MCP server on Dapr Docs</title><link>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/</link><description>Recent content in Dapr MCP server on Dapr Docs</description><generator>Hugo</generator><language>en</language><atom:link href="https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting started with the Dapr MCP server</title><link>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-getting-started/</guid><description>&lt;p>This guide installs the Dapr MCP server, runs it next to a Dapr sidecar with two in-memory components, and connects an MCP client to it.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.dapr.io/getting-started/install-dapr-cli/">Dapr CLI&lt;/a>, with Dapr &lt;a href="https://docs.dapr.io/getting-started/install-dapr-selfhost/">initialized in self-hosted mode&lt;/a>&lt;/li>
&lt;li>An MCP client, such as Claude Desktop, Cursor, or Claude Code&lt;/li>
&lt;/ul>
&lt;h2 id="step-1-install-the-server">Step 1: Install the server&lt;/h2>
&lt;p>Pick one of the following.&lt;/p>








&lt;ul class="nav nav-tabs" id="tabs-2" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
 data-td-tp-persist="release binary" aria-controls="tabs-02-00" aria-selected="true">
 Release binary
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
 data-td-tp-persist="go" aria-controls="tabs-02-01" aria-selected="false">
 Go
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-02" role="tab"
 data-td-tp-persist="container image" aria-controls="tabs-02-02" aria-selected="false">
 Container image
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-2-content">
 &lt;div class="tab-body tab-pane fade show active"
 id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
 &lt;p>Each &lt;a href="https://github.com/dapr/dapr-mcp-server/releases">GitHub release&lt;/a> publishes a binary per platform, named &lt;code>dapr-mcp-server-&amp;lt;os&amp;gt;-&amp;lt;arch&amp;gt;&lt;/code>, with a &lt;code>checksums.txt&lt;/code> file. Builds are available for &lt;code>linux-amd64&lt;/code>, &lt;code>linux-arm64&lt;/code>, &lt;code>darwin-amd64&lt;/code>, &lt;code>darwin-arm64&lt;/code>, and &lt;code>windows-amd64&lt;/code> (with an &lt;code>.exe&lt;/code> suffix).&lt;/p></description></item><item><title>Dapr MCP server configuration reference</title><link>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-configuration/</guid><description>&lt;p>The Dapr MCP server takes a few command-line flags and reads everything else from environment variables. The server checks authentication settings at startup and exits with an error if they are invalid or incomplete, rather than starting without protection.&lt;/p>
&lt;h2 id="command-line-flags">Command-line flags&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Flag&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>--http &amp;lt;addr&amp;gt;&lt;/code>&lt;/td>
 &lt;td>Not set (stdio)&lt;/td>
 &lt;td>Serve streamable HTTP on this address, for example &lt;code>localhost:8080&lt;/code> or &lt;code>0.0.0.0:8080&lt;/code>, instead of stdio. The health endpoints are served on the same address.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--version&lt;/code>&lt;/td>
 &lt;td>&lt;code>false&lt;/code>&lt;/td>
 &lt;td>Print the version and exit.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--health-check&lt;/code>&lt;/td>
 &lt;td>&lt;code>false&lt;/code>&lt;/td>
 &lt;td>Request &lt;code>/livez&lt;/code> from a running server and exit with &lt;code>0&lt;/code> on a &lt;code>200&lt;/code> response, &lt;code>1&lt;/code> otherwise. The container image uses this for its &lt;code>HEALTHCHECK&lt;/code>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--health-check-addr &amp;lt;host:port&amp;gt;&lt;/code>&lt;/td>
 &lt;td>From &lt;code>--http&lt;/code>, else &lt;code>localhost:8080&lt;/code>&lt;/td>
 &lt;td>Address that &lt;code>--health-check&lt;/code> probes. A wildcard host such as &lt;code>0.0.0.0&lt;/code> is probed as &lt;code>localhost&lt;/code>.&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="server-and-dapr-connection">Server and Dapr connection&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Variable&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>DAPR_GRPC_PORT&lt;/code>&lt;/td>
 &lt;td>&lt;code>50001&lt;/code>&lt;/td>
 &lt;td>Port of the Dapr sidecar&amp;rsquo;s gRPC API on &lt;code>127.0.0.1&lt;/code>. &lt;code>dapr run&lt;/code> and the Kubernetes sidecar injector set this for you.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>DAPR_GRPC_ENDPOINT&lt;/code>&lt;/td>
 &lt;td>Not set&lt;/td>
 &lt;td>Full address of the sidecar&amp;rsquo;s gRPC API. Takes precedence over &lt;code>DAPR_GRPC_PORT&lt;/code>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>DAPR_API_TOKEN&lt;/code>&lt;/td>
 &lt;td>Not set&lt;/td>
 &lt;td>Token sent to the sidecar when it requires &lt;a href="https://docs.dapr.io/operations/security/api-token/">API token authentication&lt;/a>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>DAPR_CLIENT_TIMEOUT_SECONDS&lt;/code>&lt;/td>
 &lt;td>&lt;code>5&lt;/code>&lt;/td>
 &lt;td>Timeout for each attempt to connect to the sidecar. The server makes up to five attempts, two seconds apart, then exits.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>DAPR_MCP_SERVER_LOG_LEVEL&lt;/code>&lt;/td>
 &lt;td>&lt;code>info&lt;/code>&lt;/td>
 &lt;td>Log level: &lt;code>debug&lt;/code>, &lt;code>info&lt;/code>, &lt;code>warn&lt;/code>, or &lt;code>error&lt;/code>. Logs are JSON on stderr. At &lt;code>debug&lt;/code>, request headers are logged with credential headers redacted.&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The &lt;code>DAPR_*&lt;/code> connection variables are read by the &lt;a href="https://github.com/dapr/go-sdk">Dapr Go SDK&lt;/a> that the server uses.&lt;/p></description></item><item><title>Authenticating clients of the Dapr MCP server</title><link>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-authentication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-authentication/</guid><description>&lt;p>The Dapr MCP server can require a valid token on every MCP request it serves over streamable HTTP. Authentication is off by default. Set &lt;code>AUTH_MODE&lt;/code> to turn it on:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;code>AUTH_MODE&lt;/code>&lt;/th>
 &lt;th>Accepts&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Not set, or &lt;code>disabled&lt;/code>&lt;/td>
 &lt;td>Any request. Use only on &lt;code>localhost&lt;/code>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>oidc&lt;/code>&lt;/td>
 &lt;td>ID or access tokens (JWTs) from an OpenID Connect provider&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>spiffe&lt;/code>&lt;/td>
 &lt;td>SPIFFE JWT-SVIDs, validated with trust bundles from the SPIFFE Workload API&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>dapr-sentry&lt;/code>&lt;/td>
 &lt;td>JWTs issued by Dapr Sentry for a Dapr app&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>hybrid&lt;/code>&lt;/td>
 &lt;td>Any combination of the three above&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Authentication only applies to the HTTP transport. Over stdio, the MCP client starts the server as a local process, and there is no network listener to protect.&lt;/p></description></item><item><title>Dapr MCP server tool reference</title><link>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-tool-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-tool-reference/</guid><description>&lt;p>The Dapr MCP server exposes 17 tools. Three are always registered. The rest are registered only while the sidecar has at least one component of the matching type, so an agent never sees tools it can&amp;rsquo;t use.&lt;/p>
&lt;p>The schema the server sends when a client connects is the authoritative definition of each tool. This page is a readable summary of it.&lt;/p>
&lt;h2 id="call-get_components-first">Call &lt;code>get_components&lt;/code> first&lt;/h2>
&lt;p>Component-specific tools take a component name as input, such as &lt;code>storeName&lt;/code> or &lt;code>pubsubName&lt;/code>. An agent should call &lt;code>get_components&lt;/code> first to learn the names that exist, rather than guess. The server&amp;rsquo;s instructions to the model say the same thing, and tell it to pass &lt;code>metadata&lt;/code> fields as JSON objects (&lt;code>{}&lt;/code>), never as strings (&lt;code>&amp;quot;{}&amp;quot;&lt;/code>).&lt;/p></description></item><item><title>Dapr MCP server observability</title><link>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-observability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dapr.io/developing-ai/mcp/dapr-mcp-server/dapr-mcp-server-observability/</guid><description>&lt;p>The Dapr MCP server exports traces, metrics, and logs over the OpenTelemetry Protocol (OTLP), and serves health endpoints for probes when it runs over HTTP.&lt;/p>
&lt;h2 id="turn-on-telemetry">Turn on telemetry&lt;/h2>
&lt;p>Telemetry is off until you set an OTLP endpoint. Point the server at an OpenTelemetry Collector, or any backend that accepts OTLP:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">OTEL_EXPORTER_OTLP_ENDPOINT&lt;/span>&lt;span class="o">=&lt;/span>http://localhost:4317
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">OTEL_SERVICE_NAME&lt;/span>&lt;span class="o">=&lt;/span>dapr-mcp-server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dapr run --app-id dapr-mcp-server --resources-path ./components -- dapr-mcp-server --http localhost:8080
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>An endpoint without a scheme, such as &lt;code>otel-collector:4317&lt;/code>, uses TLS. Add &lt;code>OTEL_EXPORTER_OTLP_INSECURE=true&lt;/code> to send plaintext to an endpoint like that, or give the scheme explicitly. To use OTLP over HTTP instead of gRPC, set &lt;code>OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf&lt;/code> and use the HTTP port, usually &lt;code>4318&lt;/code>.&lt;/p></description></item></channel></rss>