Modul 7 – Custom Tools, MCP och integrationer
OpenCode-utbildningen på AIWiki.se ← Tillbaka till översikten
Två sätt att utöka en agent
När inbyggda verktyg (läs fil, skriv fil, kör kommando, sök kod) inte räcker finns det två vägar:
- Custom Tools – lokala verktyg du definierar direkt, körs i samma process.
- MCP-servrar – externa processer som agenten kommunicerar med via Model Context Protocol.
De är inte utbytbara. De tjänar olika syften och passar olika situationer.
Custom Tools
Custom Tools är lokala verktyg som du definierar i OpenCodes konfiguration. Agenten kan anropa dem precis som inbyggda verktyg.
Struktur
{
"tools": {
"custom": [
{
"name": "query_database",
"description": "Kör en SELECT-query mot development-databasen",
"type": "bash",
"command": "psql $DATABASE_URL -c '{query}' --csv",
"parameters": {
"query": {
"type": "string",
"description": "SQL SELECT-query att köra"
}
},
"permissions": {
"allow_patterns": ["SELECT *"],
"deny_patterns": ["DROP *", "DELETE *", "UPDATE *", "INSERT *"]
}
}
]
}
}
Säkerhetsmodell för Custom Tools
Custom Tools exekveras i den lokala miljön. Det innebär att säkerhetsmodellen är kritisk:
- Definiera explicita ``allow_patterns`` och ``deny_patterns`` för SQL-verktyg.
- Kör med minsta möjliga behörighet (read-only databaskonton, begränsade API-nycklar).
- Logga alla anrop från custom tools i CI-miljöer.
- Undvik att lägga hemligheter direkt i verktygets konfiguration – använd miljövariabler.
Exempel: verktyg för intern API-dokumentation
{
"name": "fetch_api_schema",
"description": "Hämtar aktuellt API-schema från intern developer portal",
"type": "http",
"url": "https://api-portal.intern/schema/{service}",
"method": "GET",
"headers": {
"Authorization": "Bearer $PORTAL_API_KEY"
},
"parameters": {
"service": {
"type": "string",
"description": "Tjänstens namn (t.ex. 'users', 'orders')"
}
}
}
MCP – Model Context Protocol
MCP är ett öppet protokoll för att ansluta externa system till AI-agenter. Det är designat av Anthropic men är provider-agnostiskt.
En MCP-server är en separat process som:
- Exponerar verktyg (tools) som agenten kan anropa
- Kan tillhandahålla resurser (resources) – filer, dokument, data
- Kommunicerar via JSON-RPC
MCP vs Custom Tools
| Dimension | Custom Tools | MCP-server |
|---|---|---|
| Komplexitet | Enkel (JSON-config) | Kräver separat implementation |
| Separation | Körs i samma process | Separat process, isolerad |
| Återanvändbarhet | Per OpenCode-installation | Kan användas av alla MCP-klienter |
| Stateful | Nej | Kan hålla state |
| Externa system | Enkla HTTP-anrop | Komplexa integrationer med autentisering |
Tumregel: Custom Tools för enkla anrop. MCP för komplexa, stateful integrationer med externa system.
Konfigurera MCP-server
{
"mcp": {
"servers": [
{
"name": "mem0-memory",
"type": "stdio",
"command": "npx",
"args": ["-y", "@mem0ai/mem0-mcp"],
"env": {
"MEM0_API_KEY": "$MEM0_API_KEY"
}
},
{
"name": "github",
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "$GITHUB_TOKEN"
}
}
]
}
}
Vanliga MCP-servrar
| Server | Syfte | Typiskt användningsfall |
|---|---|---|
| ``@mem0ai/mem0-mcp`` | Persistent minne | Spara beslut och kontext mellan sessioner |
| ``@modelcontextprotocol/server-github`` | GitHub-integration | Läs issues, PRs, kod utan checkout |
| ``@modelcontextprotocol/server-postgres`` | Databas | Läs databasstruktur och data |
| ``@modelcontextprotocol/server-filesystem`` | Filsystem | Expanderat filsystemstöd |
| Anytype MCP | Kunskapsbase | Integrera mot Anytype-dokument |
Arkitekturmönster
Mönster 1: Dokumentation med persistent minne
Kodbas → OpenCode → MCP (Mem0) → Persistent minne
↓
Dokumentation uppdateras
med kontext från tidigare sessioner
Användningsfall: en agent som arbetar med en stor kodbas under lång tid behöver minnas beslut som fattades i tidigare sessioner. Mem0 fungerar som ett externt minne.
Mönster 2: Läs-skriv-separation
CI-pipeline → OpenCode (read-only agent)
↓ MCP
GitHub (läs issues, PRs)
PostgreSQL (läs schema)
↓
Genererar rapport / dokumentation
(skriver INTE till databas eller repo direkt)
En agent i CI ska nästan aldrig ha skrivrättigheter till produktionssystem. MCP-anslutningar kan konfigureras read-only.
Mönster 3: Självhostad vs molnbaserad MCP
| Aspekt | Självhostad | Molnbaserad |
|---|---|---|
| Kontroll | Full kontroll | Leverantörsberoende |
| Dataresidency | Data lämnar inte lokalt | Data skickas externt |
| Driftkostnad | Kräver infrastruktur | Ingår i tjänsten |
| Tillgänglighet | Beror på din infrastruktur | Hög tillgänglighet |
För offentlig sektor och organisationer med GDPR-krav: självhostad MCP är ofta nödvändigt för känslig data. En hybrid är möjlig – icke-känslig data via molntjänst, känslig data via självhostad MCP.
Implementera en enkel MCP-server
En minimal MCP-server i TypeScript (som ett exempel på vad som krävs):
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server(
{ name: "intern-dokumentation", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
server.setRequestHandler("tools/list", async () => ({
tools: [
{
name: "sokDokument",
description: "Sök i intern dokumentationsbas",
inputSchema: {
type: "object",
properties: {
query: { type: "string", description: "Sökfråga" }
},
required: ["query"]
}
}
]
}));
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "sokDokument") {
const query = request.params.arguments.query;
// Hämta från intern källa...
return { content: [{ type: "text", text: `Resultat för: ${query}` }] };
}
});
const transport = new StdioServerTransport();
await server.connect(transport);
Sammanfattning
- Custom Tools är enkla lokala verktyg – bra för enkla HTTP-anrop och bash-kommandon.
- MCP är protokollet för komplexa externa integrationer med separation och stateful stöd.
- Säkerhetsmodellen är kritisk för båda – principen om minsta privilegium gäller.
- Läs-skriv-separation är ett viktigt arkitekturmönster för CI och produktionsmiljöer.
- Självhostad MCP är nödvändigt för känslig data i reglerade miljöer.
Föregående modul: ← Modul 6 – CLI, TUI och automatisering Nästa modul: Modul 8 – Governance, säkerhet och organisation →