ragatanga-mcp-sdk
Version:
SDK for integrating with the Ragatanga Management Control Plane (MCP) with Next.js 15, React 19, WebSocket and Arrow IPC support
491 lines (383 loc) • 13.3 kB
Markdown
# Ragatanga MCP SDK
SDK for integrating with the Ragatanga Management Control Protocol (MCP) server with Next.js 15, React 19, and WebSocket support.
> **Note:** This README documents version 0.8.7 features. Ensure your package.json version matches the documentation by running `npm version 0.8.7` before publishing.
## What's New in v0.8.7
### Major Improvements
- **Enhanced Transport Organization**:
- Consistent module structure aligned with server implementation
- Clear separation between HTTP, WebSocket, SSE, Arrow IPC, and standard transports
- Unified transport interface for better maintainability
- Improved transport type exports for TypeScript
- **Comprehensive Tenant Service**:
- Complete tenant management API integration
- Support for all tenant operations including CRUD and API key management
- Error handling aligned with server implementation
- Type-safe tenant and API key interfaces
- **Client-side Redis Caching**:
- Redis-compatible client-side caching layer
- Support for memory, localStorage, sessionStorage, and custom storage backends
- Built-in rate limiting awareness
- Cache statistics and management tools
- Automatic cache invalidation and LRU eviction policy
- Etag support for conditional requests
### Previous Improvements
- **Arrow IPC Transport**: Efficient binary data transfer using Apache Arrow format
- **Client ID Support**: Improved connection management with client identification
- **Type Improvements**: Enhanced TypeScript type definitions
## What's New in v0.8.1
### Major Improvements
- **Enhanced TypeScript Type System**:
- Centralized type exports for easier imports
- Modular type organization for improved code completion
- Specialized type modules for SSE and WebSocket
- Improved type documentation
- Dedicated type paths for each component and transport
## What's New in v0.8.0
### Major Improvements
- **Client ID Support**:
- Server now includes a unique client ID with every response
- Clients automatically store and send back this ID with subsequent requests
- Ensures proper message routing in multi-client environments
- Improves connection stability in WebSocket and SSE connections
- **Transport Layer Enhancements**:
- Improved connection management with persistent client identification
- Enhanced message routing with client ID tracking
- Better session management across disconnections and reconnects
- **Arrow IPC Transport**: Efficient binary data transfer using Apache Arrow format
- **MCP Protocol Compliance**: Updated to comply with MCP Protocol Revision 2024-11-05
### Previous Features (v0.7.0)
- **Module Resolution Fixes**: Updated exports field in package.json to properly expose modules with complete TypeScript typings support
- **Transport Layer Enhancements**:
- Improved SSE implementation with better error handling, heartbeats, and reconnection logic
- Enhanced WebSocket client with robust backoff strategy and connection lifecycle management
- Added connection status tracking and callbacks
- **Tools Discovery and Execution**: Added support for the tools discovery endpoint and tool execution
- **MCPProvider Enhancements**:
- Simplified provider implementation with error boundary handling
- Reduced dependencies for better performance
- Added context isolation to prevent unnecessary re-renders
- **Better Error Handling**: Comprehensive error handling throughout the SDK
- **Type Improvements**: Better type definitions for responses and parameters
## Features
- **Type-safe API Calls**: Built-in Zod schema validation ensures response types match expectations
- **Path Parameter Handling**: Type-safe URL path parameter handling
- **Modern Error Handling**: Detailed error reporting with proper error hierarchies
- **React Integration**: SWR-powered hooks for data fetching and state management
- **WebSocket Support**: Advanced real-time communication with multiplexing and message queuing
- **Next.js Support**: Built-in support for Next.js App Router and Server Components
- **Flexible Configuration**: Configurable client with sensible defaults
- **Arrow IPC**: Efficient binary data transfer using Apache Arrow format
## 📦 Installation and Usage
### Installation
```bash
npm install ragatanga-mcp-sdk
# or with yarn
yarn add ragatanga-mcp-sdk
# or with pnpm
pnpm add ragatanga-mcp-sdk
```
### Browser Compatibility
For client-side usage in Next.js or other browser environments, use the browser-safe version:
```typescript
// Import the browser-safe version
import { createClient } from 'ragatanga-mcp-sdk/browser';
// Create a client
const client = createClient({
baseUrl: 'https://api.mcp.ai',
apiKey: 'your-api-key'
});
// Use the client
const response = await client.get('/resources');
```
This version avoids Node.js-specific features that can cause issues in browser environments.
### Basic Usage
```typescript
import { MCPClient } from 'ragatanga-mcp-sdk';
const client = new MCPClient({
baseUrl: 'https://api.mcp.ai',
apiKey: 'your-api-key', // Optional
token: 'your-token', // Optional
tenantId: 'tenant-id' // Optional
});
// Make API requests
const response = await client.getOntologies();
```
### React Integration
```tsx
import { MCPProvider, useMCPClient } from 'ragatanga-mcp-sdk/react';
function App() {
return (
<MCPProvider
options={{
baseUrl: 'https://api.mcp.ai',
token: 'your-token'
}}
transport="websocket" // 'websocket', 'sse', or 'none'
errorBoundary={true}
>
<YourComponent />
</MCPProvider>
);
}
function YourComponent() {
const client = useMCPClient();
// Use client to make API calls
// ...
}
```
## Tenant Service
The SDK provides comprehensive tenant management capabilities:
```typescript
import { createTenantServiceClient } from 'ragatanga-mcp-sdk/client/tenant-service';
// Create a tenant service client
const tenantService = createTenantServiceClient({
baseUrl: 'https://api.mcp.ai',
token: 'your-token'
});
// List all tenants (admin only)
const tenants = await tenantService.listTenants();
// Get a specific tenant
const tenant = await tenantService.getTenant('tenant-id');
// Create a new tenant
const newTenant = await tenantService.createTenant({
name: 'New Tenant',
description: 'A new tenant for testing'
});
// Create an API key for a tenant
const apiKey = await tenantService.createApiKey({
name: 'API Key 1',
tenant_id: 'tenant-id'
});
// Resolve a tenant from an API key
const resolvedTenant = await tenantService.getTenantByApiKey('api-key-string');
```
## Client-side Redis Cache
The SDK includes a Redis-compatible client-side caching layer:
```typescript
import { createRedisCache } from 'ragatanga-mcp-sdk/client/redis-cache';
// Create a cache with custom options
const cache = createRedisCache({
storage: 'localStorage', // Use localStorage for persistence
maxSize: 200, // Store up to 200 items
defaultTTL: 600, // 10 minutes default TTL
namespace: 'my-app' // Custom namespace
});
// Store a value with a custom TTL and ETag
await cache.set('user:123', userData, {
ttl: 3600, // 1 hour TTL
etag: '"abc123"' // ETag for conditional requests
});
// Retrieve a value
const { value, etag } = await cache.get('user:123');
// Check rate limits
if (cache.isRateLimited('/api/expensive-endpoint')) {
console.log('Rate limited, try again later');
}
// Get cache statistics
const stats = cache.getStats();
console.log(`Cache hits: ${stats.hits}, misses: ${stats.misses}`);
```
## Using Types (v0.8.1+)
### Importing Types
```typescript
// Import core types from the types module
import { MCPOptions, MCPClientOptions } from 'ragatanga-mcp-sdk/types';
// Import WebSocket-specific types
import { WebSocketMessage } from 'ragatanga-mcp-sdk/websocket/types';
// Import SSE-specific types
import { SSEOptions, SSEConnectionStatus } from 'ragatanga-mcp-sdk/sse/types';
// Example of using types
const options: MCPOptions = {
baseUrl: 'https://api.mcp.ai',
apiKey: 'your-key'
};
// Create a strongly-typed message
const message: WebSocketMessage = {
type: 'query',
payload: { query: 'example' },
client_id: 'client-123' // Client ID is properly typed
};
```
### Extending SDK Types
Instead of redefining types, you can extend the SDK types with your own additions:
```typescript
import { SSEOptions } from 'ragatanga-mcp-sdk/sse/types';
// Extend the SDK options with your own additions
interface EnhancedSSEOptions extends SSEOptions {
showNotifications?: boolean;
customProperty?: string;
}
// Use the extended type
function createCustomSSEClient(options: EnhancedSSEOptions) {
// Implementation...
}
```
### Using with React Hooks
When creating custom hooks or components, use the appropriate import paths:
```typescript
// React-specific hooks
import {
MCPProvider,
useMCPClient,
useQuery,
useMutation,
useWebSocket,
useSSE,
useMCPErrorHandler
} from 'ragatanga-mcp-sdk/react';
// Client and types
import { useState, useRef } from 'react';
import { MCPClient } from 'ragatanga-mcp-sdk';
import { MCPOptions } from 'ragatanga-mcp-sdk/types';
import { WebSocketMessage } from 'ragatanga-mcp-sdk/websocket/types';
function useCustomClient(options: MCPOptions) {
const [messages, setMessages] = useState<WebSocketMessage[]>([]);
const clientRef = useRef<MCPClient | null>(null);
// Hook implementation...
return { messages, client: clientRef.current };
}
```
## Using WebSockets
```tsx
import { useMCPWebSocket } from 'ragatanga-mcp-sdk/react';
function WebSocketComponent() {
const ws = useMCPWebSocket();
useEffect(() => {
const subscription = ws.subscribe('entity_update', (data) => {
console.log('Entity updated:', data);
});
// Cleanup subscription
return () => subscription.unsubscribe();
}, [ws]);
// Resolve an entity by URI
const handleResolve = () => {
ws.resolveUri('entity://example/123', 2);
};
return (
<button onClick={handleResolve}>Resolve Entity</button>
);
}
```
## Using Server-Sent Events (SSE)
```tsx
import { useMCPSSE } from 'ragatanga-mcp-sdk/react';
function SSEComponent() {
const sseClient = useMCPSSE();
useEffect(() => {
// Connect to SSE endpoint
sseClient.connect();
// Register event handlers
const unsubscribe = sseClient.on('entity_update', (event) => {
console.log('Entity updated:', event.data);
});
// Cleanup
return () => {
unsubscribe();
sseClient.disconnect();
};
}, [sseClient]);
return <div>Listening for entity updates...</div>;
}
```
## Tools API Integration
```typescript
// Fetch available tools
const tools = await client.getTools();
// Execute a tool with parameters
const result = await client.executeTool('search_entities', {
query: 'example query',
limit: 10
});
// Stream tool execution (for long-running operations)
await client.streamTool(
'generate_text',
{ prompt: 'Hello, world!' },
(chunk) => {
console.log('Received chunk:', chunk);
}
);
```
## Error Handling
### React Component Error Handling
```tsx
import { useMCPErrorHandler } from 'ragatanga-mcp-sdk/react';
function ErrorHandlingComponent() {
useMCPErrorHandler((error, source) => {
console.error(`Error in ${source}:`, error);
// Handle the error (show notification, etc.)
});
return <div>Component with error handling</div>;
}
```
### Specialized Ontology Error Handling
```typescript
import { OntologyClient } from 'ragatanga-mcp-sdk';
import {
OntologyEntityNotFoundError,
OntologySparqlError
} from 'ragatanga-mcp-sdk/errors';
async function queryOntology() {
const client = new OntologyClient({
baseUrl: 'https://api.mcp.ai',
token: 'your-token'
});
try {
// Attempt to query the ontology
await client.queryConcept({ uri: 'entity:uri' });
} catch (error) {
// Handle specific error types
if (error instanceof OntologyEntityNotFoundError) {
console.error(`Entity not found: ${error.entityUri}`);
} else if (error instanceof OntologySparqlError) {
console.error(`SPARQL error in query: ${error.query}`);
} else {
console.error('Unknown error:', error);
}
}
}
```
## Advanced Configuration
```tsx
<MCPProvider
options={{
baseUrl: 'https://api.mcp.ai',
token: 'your-token',
defaultFetchOptions: {
credentials: 'include',
headers: {
'X-Custom-Header': 'value'
}
}
}}
transport="websocket"
defaultHeaders={{
'Content-Type': 'application/json'
}}
onError={(error, source) => {
console.error(`Error in ${source}:`, error);
}}
errorBoundary={true}
autoReconnect={true}
>
{/* Your app */}
</MCPProvider>
```
## Examples
Check the `examples` directory for more usage examples, including:
- Basic API client usage
- React hooks with SWR
- WebSocket real-time communication
- Server-Sent Events (SSE) integration
- Next.js integration
## Publishing
To publish a new version of the SDK:
```bash
# Update version in package.json
npm version patch # or minor, or major
# Build the package
npm run build
# Publish to npm
npm publish
```
## License
MIT