Skip to main content

SDK Examples

SDKs (Planned)

Official SDKs are under development and will be released incrementally. The examples below show the planned SDK interface. For now, use the REST API directly with your HTTP client of choice. See the cURL Examples section at the bottom for working examples.

Code examples for integrating PlexMCP into your applications.

Planned SDKs

  • TypeScript/JavaScript: npm install @plexmcp/sdk
  • Python: pip install plexmcp
  • Go: go get github.com/plexmcp/plexmcp-go

TypeScript/JavaScript

Installation

npm install @plexmcp/sdk
# or
yarn add @plexmcp/sdk
# or
pnpm add @plexmcp/sdk

Basic Usage

import { PlexMCP } from '@plexmcp/sdk';

const client = new PlexMCP({
apiKey: process.env.PLEXMCP_API_KEY,
});

// List all MCPs
const mcps = await client.mcps.list();
console.log(mcps);

// Invoke a tool
const result = await client.mcp.invoke({
mcpId: 'mcp_123',
tool: 'get_weather',
arguments: {
location: 'San Francisco',
},
});
console.log(result);

Error Handling

import { PlexMCP, PlexMCPError } from '@plexmcp/sdk';

const client = new PlexMCP({
apiKey: process.env.PLEXMCP_API_KEY,
});

try {
const result = await client.mcp.invoke({
mcpId: 'mcp_123',
tool: 'get_weather',
arguments: { location: 'SF' },
});
} catch (error) {
if (error instanceof PlexMCPError) {
switch (error.code) {
case 'rate_limited':
console.log('Rate limited, waiting...');
await sleep(error.retryAfter * 1000);
break;
case 'mcp_unreachable':
console.log('MCP is down');
break;
default:
console.error('API error:', error.message);
}
} else {
throw error;
}
}

Streaming Responses

const stream = await client.mcp.invokeStream({
mcpId: 'mcp_123',
tool: 'generate_report',
arguments: { query: 'sales data' },
});

for await (const chunk of stream) {
process.stdout.write(chunk);
}

Python

Installation

pip install plexmcp

Basic Usage

import os
from plexmcp import PlexMCP

client = PlexMCP(api_key=os.environ["PLEXMCP_API_KEY"])

# List all MCPs
mcps = client.mcps.list()
for mcp in mcps:
print(f"{mcp.name}: {mcp.status}")

# Invoke a tool
result = client.mcp.invoke(
mcp_id="mcp_123",
tool="get_weather",
arguments={"location": "San Francisco"}
)
print(result)

Async Usage

import asyncio
from plexmcp import AsyncPlexMCP

async def main():
client = AsyncPlexMCP(api_key=os.environ["PLEXMCP_API_KEY"])

result = await client.mcp.invoke(
mcp_id="mcp_123",
tool="get_weather",
arguments={"location": "San Francisco"}
)
print(result)

asyncio.run(main())

Error Handling

from plexmcp import PlexMCP, PlexMCPError, RateLimitError

client = PlexMCP(api_key=os.environ["PLEXMCP_API_KEY"])

try:
result = client.mcp.invoke(
mcp_id="mcp_123",
tool="get_weather",
arguments={"location": "SF"}
)
except RateLimitError as e:
print(f"Rate limited, retry after {e.retry_after} seconds")
time.sleep(e.retry_after)
except PlexMCPError as e:
print(f"API error: {e.code} - {e.message}")

Go

Installation

go get github.com/PlexMCP/PlexMCP-OSS-go

Basic Usage

package main

import (
"context"
"fmt"
"os"

"github.com/PlexMCP/PlexMCP-OSS-go"
)

func main() {
client := plexmcp.NewClient(os.Getenv("PLEXMCP_API_KEY"))

// List MCPs
mcps, err := client.MCPs.List(context.Background(), nil)
if err != nil {
panic(err)
}

for _, mcp := range mcps {
fmt.Printf("%s: %s\n", mcp.Name, mcp.Status)
}

// Invoke a tool
result, err := client.MCP.Invoke(context.Background(), &plexmcp.InvokeRequest{
MCPID: "mcp_123",
Tool: "get_weather",
Arguments: map[string]interface{}{
"location": "San Francisco",
},
})
if err != nil {
panic(err)
}

fmt.Println(result)
}

Error Handling

result, err := client.MCP.Invoke(ctx, req)
if err != nil {
var apiErr *plexmcp.APIError
if errors.As(err, &apiErr) {
switch apiErr.Code {
case "rate_limited":
time.Sleep(time.Duration(apiErr.RetryAfter) * time.Second)
// Retry
case "mcp_unreachable":
log.Println("MCP is down")
default:
log.Printf("API error: %s", apiErr.Message)
}
} else {
return err
}
}

cURL

List MCPs

curl -X GET "https://api.plexmcp.com/v1/mcps" \
-H "Authorization: ApiKey $PLEXMCP_API_KEY"

Invoke Tool

curl -X POST "https://api.plexmcp.com/mcp" \
-H "Authorization: ApiKey $PLEXMCP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mcp_id": "mcp_123",
"tool": "get_weather",
"arguments": {
"location": "San Francisco"
}
}'

With jq for Pretty Output

curl -s -X POST "https://api.plexmcp.com/mcp" \
-H "Authorization: ApiKey $PLEXMCP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mcp_id": "mcp_123",
"tool": "get_weather",
"arguments": {"location": "SF"}
}' | jq .

Framework Integrations

Next.js API Route

// app/api/weather/route.ts
import { PlexMCP } from '@plexmcp/sdk';
import { NextResponse } from 'next/server';

const client = new PlexMCP({
apiKey: process.env.PLEXMCP_API_KEY,
});

export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const location = searchParams.get('location');

const result = await client.mcp.invoke({
mcpId: 'mcp_weather',
tool: 'get_weather',
arguments: { location },
});

return NextResponse.json(result);
}

FastAPI

from fastapi import FastAPI
from plexmcp import PlexMCP

app = FastAPI()
client = PlexMCP(api_key=os.environ["PLEXMCP_API_KEY"])

@app.get("/weather/{location}")
async def get_weather(location: str):
result = await client.mcp.invoke(
mcp_id="mcp_weather",
tool="get_weather",
arguments={"location": location}
)
return result

Express.js

const express = require('express');
const { PlexMCP } = require('@plexmcp/sdk');

const app = express();
const client = new PlexMCP({
apiKey: process.env.PLEXMCP_API_KEY,
});

app.get('/weather/:location', async (req, res) => {
try {
const result = await client.mcp.invoke({
mcpId: 'mcp_weather',
tool: 'get_weather',
arguments: { location: req.params.location },
});
res.json(result);
} catch (error) {
res.status(500).json({ error: error.message });
}
});

app.listen(3000);