TypeScript'te MCP sunucuları geliştirmek için yüksek seviye bir framework'tür.
Claude Desktop config.json'a ekle
{
"mcpServers": {
"punkpeye-fastmcp": {
"command": "node",
"args": [
"~/.mcp/fastmcp/index.js"
]
}
}
} Kaynak kodu al ve yerel olarak çalıştır
git clone https://github.com/punkpeye/fastmcp.git ~/.mcp/fastmcp
cd ~/.mcp/fastmcp MCP sunucuları oluşturmak için MCP istemci oturumlarını işleyebilen bir TypeScript çerçevesi.
[!NOTE]
Python uygulaması için bkz. FastMCP.
FastMCP resmi SDK'nın üzerine inşa edilmiştir.
Resmi SDK, MCP'ler oluşturmak için temel bloklar sağlar ancak birçok uygulama detayını size bırakır:
FastMCP bu karmaşıklığı, sunulan bir çerçeve sağlayarak ortadan kaldırır:
FastMCP'yi seçin: MCP sunucularını düşük seviye uygulama detaylarıyla uğraşmadan hızlıca oluşturmak istiyorsunuz.
Resmi SDK'yı kullanın: Maksimum kontrol gerektirir veya belirli mimari gereksinimleri vardır. Bu durumda, yaygın tuzakları önlemek için FastMCP'nin uygulamasına referans olarak bakmanızı teşvik ederiz.
npm install fastmcp
[!NOTE]
FastMCP'nin gerçek dünya örnekleri birçok yerde bulunmaktadır. Örnekler için Vitrin bölümüne bakın.
import { FastMCP } from "fastmcp";
import { z } from "zod"; // Veya Standard Schema'yı destekleyen herhangi bir doğrulama kütüphanesi
const server = new FastMCP({
name: "My Server",
version: "1.0.0",
});
server.addTool({
name: "add",
description: "Add two numbers",
parameters: z.object({
a: z.number(),
b: z.number(),
}),
execute: async (args) => {
return String(args.a + args.b);
},
});
server.start({
transportType: "stdio",
});
Bu kadar! Çalışan bir MCP sunucunuz var.
Sunucuyu terminal'de test edebilirsiniz:
git clone https://github.com/punkpeye/fastmcp.git
cd fastmcp
pnpm install
pnpm build
# CLI kullanarak toplama sunucusu örneğini test edin:
npx fastmcp dev src/examples/addition.ts
# MCP Inspector kullanarak toplama sunucusu örneğini test edin:
npx fastmcp inspect src/examples/addition.ts
Kendi MCP sunucunuzu oluşturmak için bir boilerplate deposu arıyorsanız, fastmcp-boilerplate kontrol edin.
FastMCP, uzak iletişim için birden çok transport seçeneğini destekleyerek, uzak bir makinede barındırılan bir MCP'nin ağ üzerinden erişilmesini sağlar.
HTTP akışı bunu destekleyen ortamlarda SSE'ye daha verimli bir alternatif sağlar ve daha büyük payloads için potansiyel olarak daha iyi performans sunar.
HTTP akışı desteği ile sunucuyu çalıştırabilirsiniz:
server.start({
transportType: "httpStream",
httpStream: {
port: 8080,
},
});
Bu, sunucuyu başlatacak ve http://localhost:8080/mcp adresindeki HTTP akışı bağlantılarını dinleyecektir.
Not:
httpStream.endpointseçeneğini kullanarak endpoint yolunu özelleştirebilirsiniz (varsayılan/mcp'dir).
Not: Bu aynı zamanda
http://localhost:8080/sseadresinde bir SSE sunucusu başlatır.
Bu sunuculara uygun client transport kullanarak bağlanabilirsiniz.
HTTP akışı bağlantıları için:
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const client = new Client(
{
name: "example-client",
version: "1.0.0",
},
{
capabilities: {},
},
);
const transport = new StreamableHTTPClientTransport(
new URL(`http://localhost:8080/mcp`),
);
await client.connect(transport);
SSE bağlantıları için:
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
const client = new Client(
{
name: "example-client",
version: "1.0.0",
},
{
capabilities: {},
},
);
const transport = new SSEClientTransport(new URL(`http://localhost:8080/sse`));
await client.connect(transport);
FastMCP, SSL sertifika seçenekleri sağlayarak HTTPS'yi güvenli bağlantılar için destekler:
server.start({
transportType: "httpStream",
httpStream: {
port: 8443,
sslCert: "./path/to/cert.pem",
sslKey: "./path/to/key.pem",
sslCa: "./path/to/ca.pem", // İsteğe bağlı: istemci sertifikası kimlik doğrulaması için
},
});
Bu, https://localhost:8443/mcp adresinde sunucuyu HTTPS ile başlatacaktır.
SSL Seçenekleri:
sslCert - SSL sertifikası dosyasının yolusslKey - SSL özel anahtar dosyasının yolusslCa - (İsteğe bağlı) Karşılıklı TLS kimlik doğrulaması için CA sertifikasının yoluTest için, kendi imzalı sertifikalar oluşturabilirsiniz:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"
Üretim için, Let's Encrypt gibi güvenilir bir CA'dan sertifikalar alın.
Tam bir örnek için https-server örneğine bakın.
FastMCP, MCP uç noktalarının yanında özel HTTP rotaları eklemenize izin vererek, aynı sunucu süreci içinde REST API'ları, webhook'ları, yönetici arayüzlerini ve daha fazlasını içeren kapsamlı HTTP hizmetleri oluşturmanızı sağlar.
// REST API uç noktaları ekleme
server.addRoute("GET", "/api/users", async (req, res) => {
res.json({ users: [] });
});
// Yol parametrelerini işleme
server.addRoute("GET", "/api/users/:id", async (req, res) => {
res.json({
userId: req.params.id,
query: req.query, // Sorgu parametrelerine erişim
});
});
// POST isteklerini gövde ayrıştırması ile işleme
server.addRoute("POST", "/api/users", async (req, res) => {
const body = await req.json();
res.status(201).json({ created: body });
});
// HTML içeriğini sunma
server.addRoute("GET", "/admin", async (req, res) => {
res.send("<html><body><h1>Admin Panel</h1></body></html>");
});
// Webhook'ları işleme
server.addRoute("POST", "/webhook/github", async (req, res) => {
const payload = await req.json();
const event = req.headers["x-github-event"];
// Webhook işleme...
res.json({ received: true });
});
Özel rotalar şunları destekler:
:param) ve wildcard'lar (*)authenticate işlevini kullanarak kimlik doğrulamasıRotalar kayıt sırasına göre eşleştirilir ve belirli rotaları catch-all desenlerinden önce tanımlamanıza izin verir.
Varsayılan olarak, özel rotalar kimlik doğrulama gerektirir (yapılandırılmışsa). { public: true } seçeneğini ekleyerek rotaları genel hale getirebilirsiniz:
// Genel rota - kimlik doğrulama gerekli değil
server.addRoute(
"GET",
"/.well-known/openid-configuration",
async (req, res) => {
res.json({
issuer: "https://example.com",
authorization_endpoint: "https://example.com/auth",
token_endpoint: "https://example.com/token",
});
},
{ public: true },
);
// Özel rota - kimlik doğrulama gerekli
server.addRoute("GET", "/api/users", async (req, res) => {
// req.auth kimlik doğrulanmış kullanıcı verisi içerir
res.json({ users: [] });
});
// Genel statik dosyalar
server.addRoute(
"GET",
"/public/*",
async (req, res) => {
// Statik dosyaları kimlik doğrulaması olmadan sunma
res.send(`File: ${req.url}`);
},
{ public: true },
);
Genel rotalar şunlar için mükemmeldir:
.well-known/*)Tam bir örnek için custom-routes örneğine bakın.
FastMCP, Cloudflare Workers gibi edge runtime'ları destekleyerek MCP sunucularını dünya çapında minimum gecikme ile edge'e dağıtmayı sağlar.
| Kullanım Durumu | Sınıf | Import |
|---|---|---|
| Node.js, Express, Bun | FastMCP |
import { FastMCP } from "fastmcp" |
| Cloudflare Workers, Deno Deploy | EdgeFastMCP |
import { EdgeFastMCP } from "fastmcp/edge" |
| Özellik | FastMCP | EdgeFastMCP |
|---|---|---|
| Runtime | Node.js | Edge (V8 isolates) |
| Start yöntemi | server.start({ port }) |
export default server |
| Transport | stdio, httpStream, SSE | Yalnızca HTTP Streamable |
| Oturumlar | Stateful veya stateless | Yalnızca stateless |
| Dosya sistemi | Evet | Hayır |
| OAuth/Kimlik Doğrulama | Yerleşik authenticate seçeneği |
Hono middleware'i kullanın (planlanmış) |
| Özel rotalar | server.getApp() |
server.getApp() |
Not: EdgeFastMCP için yerleşik kimlik doğrulama bir gelecek sürüm için planlanmıştır. Hem FastMCP hem de EdgeFastMCP dahili olarak Hono kullanır, bu nedenle teknik bir engel yoktur—EdgeFastMCP sadece OAuth FastMCP'ye eklenmeden önce yazılmıştır. Node.js
http.IncomingMessageyerine webRequest'i kabul eden birauthenticateseçeneği eklemek için PR'ler memnuniyetle karşılanır.Şimdilik Hono middleware'ini kullanın:
const app = server.getApp(); app.use("/api/*", async (c, next) => { if (c.req.header("authorization") !== "Bearer secret") { return c.json({ error: "Unauthorized" }, 401); } await next(); });
FastMCP'yi Cloudflare Workers'a dağıtmak için /edge alt yolundan EdgeFastMCP sınıfını kullanın:
import { EdgeFastMCP } from "fastmcp/edge";
import { z } from "zod";
const server = new EdgeFastMCP({
name: "My Edge Server",
version: "1.0.0",
description: "MCP server running on Cloudflare Workers",
});
// Araçları, kaynakları, prompt'ları her zamanki gibi ekleyin
server.addTool({
name: "greet",
description: "Greet someone",
parameters: z.object({
name: z.string(),
}),
execute: async ({ name }) => {
return `Hello, ${name}! Served from the edge.`;
},
});
// Sunucuyu varsayılan olarak dışa aktarın (Cloudflare Workers için gerekli)
export default server;
Edge runtime'larda çalışırken:
Özel HTTP rotaları eklemek için temel Hono uygulamasına erişebilirsiniz:
const app = server.getApp();
// Açılış sayfası ekleme
app.get("/", (c) => c.html("<h1>Welcome to my MCP server</h1>"));
// REST API uç noktaları ekleme
app.get("/api/status", (c) => c.json({ status: "ok" }));
wrangler.toml dosyasını yapılandırın:
name = "my-mcp-server"
main = "src/index.ts"
compatibility_date = "2024-01-01"
Şu komutu kullanarak dağıtın:
wrangler deploy
Tam bir örnek için edge-cloudflare-worker örneğine bakın.
FastMCP, HTTP akışı için stateless işletimi destekleyerek her istek kalıcı oturumlar korulamadan bağımsız olarak işlenir. Bu, sunucusuz ortamlar, yük dengeli dağıtımlar veya oturum durumunun gerekli olmadığı durumlarda idealdir.
Stateless modunda:
stateless: true seçeneğini ekleyerek stateless modu etkinleştirebilirsiniz:
server.start({
transportType: "httpStream",
httpStream: {
port: 8080,
stateless: true,
},
});
Not: Stateless modu yalnızca HTTP akışı transport'unda mevcuttur. Kalıcı oturumlara bağlı özellikler (oturuma özgü durum gibi) stateless modunda kullanılmayacaktır.
CLI argümanlarını veya ortam değişkenlerini kullanarak da stateless modu etkinleştirebilirsiniz:
# CLI argümanı üzerinden
npx fastmcp dev src/server.ts --transport http-stream --port 8080 --stateless true
# Ortam değişkeni üzerinden
FASTMCP_STATELESS=true npx fastmcp dev src/server.ts
/ready sağlık kontrolü uç noktası, sunucunun stateless modunda çalıştığını gösterir:
{
"mode": "stateless",
"ready": 1,
"status": "ready",
"total": 1
}
MCP'deki Araçlar, sunucuların istemciler tarafından çağrılabilen ve LLM'ler tarafından eylemleri gerçekleştirmek için kullanılabilen yürütülebilir işlevleri ortaya çıkarmalarını sağlar.
FastMCP, araç parametrelerini tanımlamak için Standard Schema belirtimini kullanır. Bu, Zod, ArkType veya Valibot gibi tercih ettiğiniz şema doğrulama kütüphanesini (belirtimi uygulayan) kullanmanıza izin verir.
Zod Örneği:
import { z } from "zod";
server.addTool({
name: "fetch-zod",
description: "Fetch the content of a url (using Zod)",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return await fetchWebpageContent(args.url);
},
});
ArkType Örneği:
import { type } from "arktype";
server.addTool({
name: "fetch-arktype",
description: "Fetch the content of a url (using ArkType)",
parameters: type({
url: "string",
}),
execute: async (args) => {
return await fetchWebpageContent(args.url);
},
});
Valibot Örneği:
Valibot, @valibot/to-json-schema peer dependency'sini gerektirir.
import * as v from "valibot";
server.addTool({
name: "fetch-valibot",
description: "Fetch the content of a url (using Valibot)",
parameters: v.object({
url: v.string(),
}),
execute: async (args) => {
return await fetchWebpageContent(args.url);
},
});
Parametre gerektirmeyen araçlar oluştururken iki seçeneğiniz var:
Parameters özelliğini tamamen atlamak:
server.addTool({
name: "sayHello",
description: "Say hello",
// Parameters özelliği yok
execute: async () => {
return "Hello, world!";
},
});
Açıkça boş parametreleri tanımlamak:
import { z } from "zod";
server.addTool({
name: "sayHello",
description: "Say hello",
parameters: z.object({}), // Boş nesne
execute: async () => {
return "Hello, world!";
},
});
[!NOTE]
Her iki yaklaşım da Cursor dahil tüm MCP istemcileri ile tamamen uyumludur. FastMCP her iki durumda da uygun şemayı otomatik olarak oluşturur.
Bir aracın tanımına isteğe bağlı bir canAccess işlevini ekleyerek, kimlik doğrulanmış kullanıcılar için kullanılabilir araçları kontrol edebilirsiniz. Bu işlev, kimlik doğrulama bağlamını alır ve kullanıcı araca erişmesine izin verilirse true döndürmelidir.
server.addTool({
name: "admin-tool",
description: "An admin-only tool",
canAccess: (auth) => auth?.role === "admin",
execute: async () => "Welcome, admin!",
});
execute bir dize döndürebilir:
server.addTool({
name: "download",
description: "Download a file",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return "Hello, world!";
},
});
Yukarıdaki aşağıdaki ile eşdeğerdir:
server.addTool({
name: "download",
description: "Download a file",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return {
content: [
{
type: "text",
text: "Hello, world!",
},
],
};
},
});
Mesaj listesi döndürmek istiyorsanız, content özelliğine sahip bir nesne döndürebilirsiniz:
server.addTool({
name: "download",
description: "Download a file",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return {
content: [
{ type: "text", text: "First message" },
{ type: "text", text: "Second message" },
],
};
},
});
Bir görüntünün içerik nesnesini oluşturmak için imageContent'i kullanın:
import { imageContent } from "fastmcp";
server.addTool({
name: "download",
description: "Download a file",
parameters: z.object({
url: z.string(),
}),
execute: async (args) => {
return imageContent({
url: "https://example.com/image.png",
});
// veya...
// return imageContent({
// path: "/path/to/image.png",
// });
// veya...
// return imageContent({
// buffer: Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", "base64"),
// });
// veya...
// return {
// content: [
// await imageContent(...)
// ],
// };
},
});
imageContent işlevi şu seçenekleri alır:
url: Görüntünün URL'si.path: Görüntü dosyasının yolu.buffer: Bir buffer olarak görüntü verisi.Yalnızca url, path veya buffer birinin bel
Tüm MCP protokol özelliklerini kullanan MCP sunucusu.
Python'da MCP sunucuları oluşturmak için üst düzey bir framework.
Ekran ve ses kaydını zaman damgasıyla indeksleyen, SQL/embedding storage kullanan, semantic search ve LLM tabanlı geçmiş analizi yapan local-first sistem. NextJS plugin ekosistemi aracılığıyla bağlam farkında AI ajanlar oluşturmayı ve event-triggered aksiyonları destekler.
YouTube video bilgilerini çıkartıp dönüştürün.
Obsidian ile REST API aracılığıyla etkileşim kurma
AI ajanlarını 600+ entegrasyon ile tek bir arayüzden bağlayın - OAuth, scaling ve monitoring dahil