{"id":204,"date":"2026-11-08T07:22:36","date_gmt":"2026-11-08T03:22:36","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2026\/11\/08\/opencode-mcp-deepseek\/"},"modified":"2026-11-08T07:22:36","modified_gmt":"2026-11-08T03:22:36","slug":"opencode-mcp-deepseek","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/de\/2026\/11\/08\/opencode-mcp-deepseek\/","title":{"rendered":"MCP in OpenCode auf DeepSeek: So verbinden Sie externe Tools"},"content":{"rendered":"<p>MCP (Model Context Protocol) ist ein offenes Protokoll, das beschreibt, wie externe Tools und Datenquellen mit dem Sprachmodell verbunden werden: ein Dateisystem, Dokumentation, Task-Tracker, Bug-Tracker oder Ihr eigener Dienst. Anstatt jedes Tool in den Agenten einzubetten, richten Sie einen separaten MCP-Server ein, mit dem der Agent nach dem Standardschema kommuniziert.<\/p>\n<p>OpenCode unterst\u00fctzt MCP sofort: sowohl lokale Server, die von einem untergeordneten Prozess gestartet werden, als auch Remote-Server, auf die \u00fcber HTTP zugegriffen werden kann. Ein wichtiger Punkt ist, dass die gesamte MCP-Schicht auf der Seite von OpenCode selbst implementiert wird und nicht auf der Seite des Modellanbieters. Daher empf\u00e4ngt DeepSeek MCP-Tools als normale Funktionen in der Anfrage und muss nichts \u00fcber das Protokoll selbst wissen.<\/p>\n<p>In diesem Beitrag schaue ich mir an, wie man einen lokalen und einen Remote-Server hinzuf\u00fcgt, wie man sich autorisiert, wie man nicht in Tokens ertrinkt und was bei der Arbeit mit DeepSeek-Modellen zu beachten ist.<\/p>\n<h2>Was Sie brauchen<\/h2>\n<p>Zum Arbeiten ben\u00f6tigen Sie drei Dinge:<\/p>\n<ul>\n<li><b>OpenCode installiert.<\/b> Falls der Agent noch nicht konfiguriert ist, habe ich die Vorgehensweise zur Installation und Verbindung von DeepSeek in einem separaten Hinweis besprochen.<\/li>\n<li><b>Node.js und npx.<\/b> Notwendig f\u00fcr lokale MCP-Server, die als npm-Pakete verteilt werden.<\/li>\n<li><b>Zugriffsschl\u00fcssel.<\/b> Nur f\u00fcr die Remote-Server, die eine Autorisierung erfordern. \u00d6ffentliche Server wie Context7 funktionieren ohne Schl\u00fcssel, aber mit geringeren Limits.<\/li>\n<\/ul>\n<h2>Wie es funktioniert<\/h2>\n<p>Server werden in der OpenCode-Konfiguration im <b>mcp<\/b>-Block beschrieben. Jeder Server hat einen eindeutigen Namen, mit dem er in einer Anfrage erw\u00e4hnt werden kann. Servertools werden mit diesem Namenspr\u00e4fix registriert, sodass es zu keinen Konflikten zwischen verschiedenen Servern kommt.<\/p>\n<p>Nach dem Herstellen der Verbindung stehen den Modellen neben den integrierten Tools auch MCP-Tools zur Verf\u00fcgung: Lesen von Dateien, Bearbeiten von Code und Ausf\u00fchren von Befehlen. Aus Sicht von DeepSeek handelt es sich um gew\u00f6hnliche Funktionen, die ein Agent aufrufen kann \u2013 weshalb das Bundle ohne jegliche MCP-Unterst\u00fctzung auf der Modell-API-Seite auskommt.<\/p>\n<h2>Lokaler Server<\/h2>\n<p>Der einfachste Weg, sich mit dem Mechanismus vertraut zu machen, ist der Testserver <b>@modelcontextprotocol\/server-everything<\/b>. F\u00fcgen wir es der Datei <b>opencode.json<\/b> im Projektstammverzeichnis hinzu:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"mcp_everything\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"@modelcontextprotocol\/server-everything\"]\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Das Feld <b>Befehl<\/b> enth\u00e4lt den Server-Startbefehl und seine Argumente in Form eines Arrays. Nach dem Neustart von OpenCode erscheinen die Tools in der Sitzung und k\u00f6nnen explizit angefordert werden:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 mcp_everything, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0436\u0438\u0442\u044c 3 \u0438 4\n<\/code><\/pre>\n<\/div>\n<p>Der lokale Server verf\u00fcgt \u00fcber mehrere weitere n\u00fctzliche Felder. <b>environment<\/b> legt die Prozessumgebungsvariablen fest, <b>cwd<\/b> \u2013 das Arbeitsverzeichnis, <b>timeout<\/b> \u2013 Anforderungszeitlimit in Millisekunden und <b>enabled<\/b> erm\u00f6glicht Ihnen, den Server vor\u00fcbergehend zu deaktivieren, ohne ihn aus der Konfiguration zu entfernen.<\/p>\n<h2>Remote-Server<\/h2>\n<p>Remote-Server sind praktischer: Sie m\u00fcssen nichts lokal ausf\u00fchren und k\u00f6nnen \u00fcber eine URL darauf zugreifen. Ein gutes Beispiel ist Context7, das nach aktueller Bibliotheksdokumentation sucht. Es verbindet sich ohne Schl\u00fcssel:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"context7\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.context7.com\/mcp\"\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Wenn Sie \u00fcber ein kostenloses Context7-Konto verf\u00fcgen, liegt der Schl\u00fcssel darin, die Limits zu erh\u00f6hen. Header werden \u00fcber den <b>headers<\/b>-Block \u00fcbertragen, und es ist praktisch, den Schl\u00fcssel selbst in einer Umgebungsvariablen zu behalten:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"context7\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.context7.com\/mcp\",\n      \"headers\": {\n        \"CONTEXT7_API_KEY\": \"{env:CONTEXT7_API_KEY}\"\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Die <b>{env:NAME}<\/b>-Konstruktion ersetzt beim Laden der Konfiguration den Wert der Umgebungsvariablen, sodass der Schl\u00fcssel nicht im Repository landet. Vor dem Start des Agenten muss die Variable im Terminal exportiert werden.<\/p>\n<p>Ein weiterer n\u00fctzlicher \u00f6ffentlicher Server ist Grep von Vercel. Suchen Sie auf GitHub nach Codebeispielen:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"gh_grep\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.grep.app\"\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<h2>Autorisierung \u00fcber OAuth<\/h2>\n<p>Einige Remote-Server erfordern OAuth. OpenCode kann dieses Szenario selbst durchlaufen: Es bemerkt die 401-Antwort, l\u00f6st die Autorisierung aus und speichert die Token. Geben Sie f\u00fcr Sentry einfach den Server an:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"sentry\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.sentry.dev\/mcp\",\n      \"oauth\": {}\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Danach kann die Autorisierung manuell gestartet werden \u2013 der Browser \u00f6ffnet sich:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>opencode mcp auth sentry\n<\/code><\/pre>\n<\/div>\n<p>Servicebefehle sind auch im Arbeitsalltag n\u00fctzlich. <b>opencode mcp list<\/b> zeigt Server und Autorisierungsstatus an, <b>opencode mcp logout<\/b> l\u00f6scht gespeicherte Token und <b>opencode mcp debug<\/b> pr\u00fcft die Netzwerkkonnektivit\u00e4t und die OAuth-Erkennung f\u00fcr einen bestimmten Server. Token werden lokal in der Datei <b>~\/.local\/share\/opencode\/mcp-auth.json<\/b> gespeichert.<\/p>\n<p>Wenn der Server kein OAuth, sondern einen regul\u00e4ren API-Schl\u00fcssel verwendet, sollte die automatische Autorisierung deaktiviert werden, andernfalls versucht OpenCode, OAuth dort weiterzugeben, wo es nicht ben\u00f6tigt wird:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"my-api-key-server\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.example.com\/mcp\",\n      \"oauth\": false,\n      \"headers\": {\n        \"Authorization\": \"Bearer {env:MY_API_KEY}\"\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<h2>Werkzeugverwaltung<\/h2>\n<p>MCP-Tools verbrauchen Kontext: Jeder Server f\u00fcgt der Anfrage Beschreibungen seiner Funktionen hinzu. Daher ist es besser, Server, die selten ben\u00f6tigt werden, ausgeschaltet zu lassen. Dies kann global \u00fcber den Block <b>tools<\/b> erfolgen:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"my-mcp-foo\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"my-mcp-command-foo\"]\n    },\n    \"my-mcp-bar\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"my-mcp-command-bar\"]\n    }\n  },\n  \"tools\": {\n    \"my-mcp*\": false\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Die Vorlage <b>my-mcp*<\/b> deaktiviert alle Tools, deren Name mit diesem Pr\u00e4fix beginnt. Bei vielen Servern ist es sinnvoller, diese global zu deaktivieren und lokal f\u00fcr einen bestimmten Agenten zu aktivieren:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"my-mcp\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"my-mcp-command\"],\n      \"enabled\": true\n    }\n  },\n  \"tools\": {\n    \"my-mcp*\": false\n  },\n  \"agent\": {\n    \"my-agent\": {\n      \"tools\": {\n        \"my-mcp*\": true\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<h2>DeepSeek-Funktionen<\/h2>\n<p>Die Verbindung mit DeepSeek funktioniert, weil die Modelle Aufruffunktionen unterst\u00fctzen und die MCP-Tools daf\u00fcr wie gew\u00f6hnliche Funktionen aussehen. DeepSeek selbst verbindet keine MCP-Server und sollte dies auch nicht tun: Die Verbindung wird von OpenCode verwaltet.<\/p>\n<p>Worauf Sie achten sollten:<\/p>\n<ul>\n<li><b>Auswahl eines Modells.<\/b> F\u00fcr Routinearbeiten und kleine Bearbeitungen ist <b>Deepseek-Flash<\/b> ausreichend. F\u00fcr Aufgaben, bei denen Sie viel Kontext im Kopf behalten und ein Tool sorgf\u00e4ltig ausw\u00e4hlen m\u00fcssen, ist es besser, <b>deepseek-v4-pro<\/b>.<\/li>\n<p> zu geben<\/p>\n<li><b>Kontextgr\u00f6\u00dfe.<\/b> Schwere Server wie GitHub MCP f\u00fcgen viele Token hinzu und sto\u00dfen zusammen mit einem gro\u00dfen Projekt leicht an die Grenze. Schalten Sie sie nur f\u00fcr die Dauer einer bestimmten Aufgabe ein.<\/li>\n<li><b>Kosten<\/b> Toolschemata werden mit jeder Anfrage gesendet. Je mehr Server also einbezogen werden, desto teurer ist jede Iteration. Sie zahlen direkt an den Anbieter, sodass die zus\u00e4tzlichen Server auf Ihrer Rechnung sichtbar sind.<\/li>\n<li><b>Hinweise f\u00fcr den Agenten.<\/b> Es ist sicherer, sich nicht auf die Genialit\u00e4t des Modells zu verlassen, sondern den Server direkt in der Anfrage zu benennen oder eine Regel in <b>AGENTS.md<\/b> zu schreiben.<\/li>\n<\/ul>\n<p>Ein Beispiel f\u00fcr eine Regel f\u00fcr <b>AGENTS.md<\/b>, damit der Agent selbst auf die ben\u00f6tigte Quelle zugreift:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b context7.\n<\/code><\/pre>\n<\/div>\n<h2>Praktisches Rezept<\/h2>\n<p>F\u00fcr die allt\u00e4gliche Arbeit reichen in der Regel zwei Server aus: Context7 f\u00fcr die Dokumentation und ein schmaler Server f\u00fcr eine bestimmte Aufgabe \u2013 zum Beispiel Sentry f\u00fcr die Fehleranalyse oder Grep f\u00fcr die Suche nach Codebeispielen. Es ist besser, den Rest ausgeschaltet zu lassen und bei Bedarf einzuschalten.<\/p>\n<p>Meine Vorgehensweise ist wie folgt: Ich f\u00fcge den Server zu <b>opencode.json<\/b> hinzu, starte OpenCode neu, \u00fcberpr\u00fcfe die Liste \u00fcber <b>opencode mcp list<\/b> und stelle dann eine Testfrage, in der der Server explizit erw\u00e4hnt wird. Wenn das Tool nicht aufgerufen wird, achte ich auf <b>opencode mcp debug<\/b> und die Zeit\u00fcberschreitung \u2013 ein langsamer Server hat m\u00f6glicherweise nicht die Zeit, innerhalb der vorgesehenen 30 Sekunden zu antworten.<\/p>\n<h2>Worauf Sie achten sollten<\/h2>\n<p>Ein paar praktische Punkte. MCP-Server sind vertrauensw\u00fcrdiger Code: Der lokale Server l\u00e4uft mit Ihren Rechten auf Ihrem Computer und Sie senden Anforderungsdaten an den Remote-Server. Daher sollte die Installation von Zufallsservern aus dem Internet mit der gleichen Vorsicht erfolgen wie bei jeder Drittanbieter-CLI.<\/p>\n<p>Behalten Sie Schl\u00fcssel und Token in Umgebungsvariablen und \u00fcbertragen Sie sie nicht in das Repository. OpenCode speichert OAuth-Tokens lokal, aber auf einer gemeinsam genutzten Maschine ist dies auch eine \u00dcberlegung wert: <b>opencode mcp logout<\/b> l\u00f6scht sie, wenn der Zugriff nicht mehr ben\u00f6tigt wird.<\/p>\n<p>Und noch etwas: Schalten Sie nicht alles auf einmal ein. MCP f\u00fcgt dem Kontext Werkzeuge hinzu, und Kontext ist Geld und Qualit\u00e4t der Reaktion. Zwei oder drei wirklich notwendige Server funktionieren viel besser als zehn verbundene Server f\u00fcr alle F\u00e4lle.<\/p>\n<h2>Links<\/h2>\n<p><a href=\"https:\/\/opencode.ai\/docs\/mcp-servers\/\" rel=\"noopener\" target=\"_blank\">https:\/\/opencode.ai\/docs\/mcp-servers\/<\/a><br \/>\n<a href=\"https:\/\/opencode.ai\/docs\/config\/\" rel=\"noopener\" target=\"_blank\">https:\/\/opencode.ai\/docs\/config\/<\/a><br \/>\n<a href=\"https:\/\/modelcontextprotocol.io\/\" rel=\"noopener\" target=\"_blank\">https:\/\/modelcontextprotocol.io\/<\/a><br \/>\n<a href=\"https:\/\/github.com\/upstash\/context7\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/upstash\/context7<\/a><br \/>\n<a href=\"https:\/\/mcp.sentry.dev\" rel=\"noopener\" target=\"_blank\">https:\/\/mcp.sentry.dev<\/a><br \/>\n<a href=\"https:\/\/mcp.grep.app\" rel=\"noopener\" target=\"_blank\">https:\/\/mcp.grep.app<\/a><br \/>\n<a href=\"https:\/\/github.com\/anomalyco\/opencode\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/anomalyco\/opencode<\/a><\/p>\n<h2>Quellen<\/h2>\n<p><a href=\"https:\/\/opencode.ai\/docs\/mcp-servers\/\" rel=\"noopener\" target=\"_blank\">https:\/\/opencode.ai\/docs\/mcp-servers\/<\/a><br \/>\n<a href=\"https:\/\/modelcontextprotocol.io\/\" rel=\"noopener\" target=\"_blank\">https:\/\/modelcontextprotocol.io\/<\/a><br \/>\n<a href=\"https:\/\/api-docs.deepseek.com\/\" rel=\"noopener\" target=\"_blank\">https:\/\/api-docs.deepseek.com\/<\/a><br \/>\n<a href=\"https:\/\/api-docs.deepseek.com\/quick_start\/agent_integrations\/opencode\" rel=\"noopener\" target=\"_blank\">https:\/\/api-docs.deepseek.com\/quick_start\/agent_integrations\/opencode<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>MCP (Model Context Protocol) ist ein offenes Protokoll, das beschreibt, wie externe Tools und Datenquellen mit dem Sprachmodell verbunden werden: ein Dateisystem, Dokumentation, Task-Tracker, Bug-Tracker oder Ihr eigener Dienst. Anstatt jedes Tool in den Agenten einzubetten, richten Sie einen separaten MCP-Server ein, mit dem der Agent nach dem Standardschema kommuniziert. OpenCode unterst\u00fctzt MCP sofort: sowohl [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-204","post","type-post","status-publish","format-standard","hentry","category-notes"],"translation":{"provider":"WPGlobus","version":"3.0.6","language":"de","enabled_languages":["en","ru","zh","de","ja","fr","es","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"es":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/204","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=204"}],"version-history":[{"count":0,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/204\/revisions"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}