Skip to main content

MCP Resources

MCP resources provide data sources that AI models can read from. They support both static and parameterized URIs for flexible data access.

Creating Resources​

Use pikkuMCPResourceFunc to create MCP resources:

import { pikkuMCPResourceFunc } from '../.pikku/pikku-types.gen.js'

export const getStaticResource = pikkuMCPResourceFunc(async ({ mcp }) => {
return [
{
uri: mcp.uri!,
text: JSON.stringify('Hello! This is a static resource.'),
},
]
})

Parameterized Resources​

Resources can accept parameters through URI templates:

import { NotFoundError } from '@pikku/core'

export const getUserInfo = pikkuMCPResourceFunc<{ userId: string }>(
async (services, { userId }) => {
services.logger.info(`Getting user info for: ${userId}`)

// Mock user data - in a real app this would come from a database
const mockUsers: Record<
string,
{ userId: string; name: string; email: string; lastLogin: string }
> = {
'123': {
userId: '123',
name: 'John Doe',
email: 'john@example.com',
lastLogin: '2024-01-15T10:30:00Z',
},
'456': {
userId: '456',
name: 'Jane Smith',
email: 'jane@example.com',
lastLogin: '2024-01-14T15:45:00Z',
},
}

const user = mockUsers[userId]
if (!user) {
throw new NotFoundError(`User not found: ${userId}`)
}

return [
{
uri: `getUserInfo/${userId}`,
text: JSON.stringify(user),
},
]
}
)

Registering Resources​

Register your resources in the routes file:

// mcp.routes.ts
import { wireMCPResource } from '../.pikku/pikku-types.gen.js'
import { getStaticResource, getUserInfo } from './mcp.functions.js'

wireMCPResource({
uri: 'getStaticResource',
title: 'Static Resource',
description: 'Gets a static resource with predefined data',
func: getStaticResource,
})

wireMCPResource({
uri: 'getUserInfo/{userId}',
title: 'User Information',
description: 'Retrieve user information by user ID',
func: getUserInfo,
tags: ['user', 'profile', 'data'],
})

Return Format​

Resources return an array of resource objects:

return [
{
uri: 'resource-identifier',
text: 'Resource content as text',
// Optional: mimeType, blob for binary data
},
]

Error Handling​

Use Pikku's built-in error types for proper error responses:

import { NotFoundError, BadRequestError } from '@pikku/core'

if (!user) {
throw new NotFoundError(`User not found: ${userId}`)
}