@runbook-docs/mcp-server
Version:
Runbook Model Context Protocol Server
83 lines (82 loc) • 3.13 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.resourceHandlers = void 0;
const client_1 = __importDefault(require("@runbook-docs/client"));
const getArticle_1 = __importDefault(require("../queries/getArticle"));
const getBook_1 = __importDefault(require("../queries/getBook"));
const RESOURCE_PREFIX = 'runbook://';
const BOOK_REGEX = /^runbook:\/\/books\/(.+)$/;
const ARTICLE_REGEX = /^runbook:\/\/articles\/(.+)$/;
const resourceHandlers = function (state) {
const runbook = new client_1.default({
baseUrl: state.baseUrl,
apiToken: state.accessToken
});
return {
listResourceTemplates: () => ({
resourceTemplates: [
{
uriTemplate: `${RESOURCE_PREFIX}articles/{articleUid}`,
name: 'Article',
description: 'Retrieve an article by its UID',
mimeType: 'application/json'
}
]
}),
listResources: async () => {
const data = await runbook.query('getBooks', {
first: 100
});
const books = data.organization.books.nodes;
return books.map((book) => ({
uri: `${RESOURCE_PREFIX}books/${book.uid}`,
name: book.name,
description: book.description || `Book: ${book.name}`,
mimeType: 'application/json'
}));
},
readResource: async (uri) => {
const bookMatch = uri.match(BOOK_REGEX);
const articleMatch = uri.match(ARTICLE_REGEX);
if (bookMatch) {
const bookUid = bookMatch[1];
const data = await runbook.graphql({
query: getBook_1.default,
variables: {
bookUid
}
});
const book = data.node;
if (!book) {
throw new Error(`Book not found: ${bookUid}`);
}
return JSON.stringify({
application: 'Runbook',
type: 'Book',
...book,
url: `${state.baseUrl}/books/${bookUid}`
}, null, 2);
}
if (articleMatch) {
const articleUid = articleMatch[1];
const data = await runbook.graphql({
query: getArticle_1.default,
variables: {
articleUid
}
});
return JSON.stringify({
application: 'Runbook',
type: 'Article',
...data.node,
url: `${state.baseUrl}/articles/${articleUid}`
}, null, 2);
}
throw new Error(`Invalid URI: ${uri}`);
}
};
};
exports.resourceHandlers = resourceHandlers;