From f6ab805ef3694cf93b623d7a0bf2e1af97d302e8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:44:52 +0000 Subject: [PATCH] Add API endpoints for content and update MCP resources to use them Co-authored-by: ArthurDanjou <29738535+ArthurDanjou@users.noreply.github.com> --- server/api/contact.get.ts | 7 +++++++ server/api/education.get.ts | 15 +++++++++++++++ server/api/experiences.get.ts | 17 +++++++++++++++++ server/api/hobbies.get.ts | 7 +++++++ server/api/languages.get.ts | 7 +++++++ server/api/profile.get.ts | 7 +++++++ server/api/projects.get.ts | 7 +++++++ server/api/skills.get.ts | 7 +++++++ server/api/uses.get.ts | 19 +++++++++++++++++++ server/mcp/resources/contact.ts | 8 ++------ server/mcp/resources/education.ts | 14 +------------- server/mcp/resources/experiences.ts | 16 +--------------- server/mcp/resources/hobbies.ts | 8 ++------ server/mcp/resources/languages.ts | 8 ++------ server/mcp/resources/profile.ts | 6 +----- server/mcp/resources/projects.ts | 6 +----- server/mcp/resources/skills.ts | 12 ++++-------- server/mcp/resources/uses.ts | 18 ++---------------- 18 files changed, 109 insertions(+), 80 deletions(-) create mode 100644 server/api/contact.get.ts create mode 100644 server/api/education.get.ts create mode 100644 server/api/experiences.get.ts create mode 100644 server/api/hobbies.get.ts create mode 100644 server/api/languages.get.ts create mode 100644 server/api/profile.get.ts create mode 100644 server/api/projects.get.ts create mode 100644 server/api/skills.get.ts create mode 100644 server/api/uses.get.ts diff --git a/server/api/contact.get.ts b/server/api/contact.get.ts new file mode 100644 index 0000000..772a34e --- /dev/null +++ b/server/api/contact.get.ts @@ -0,0 +1,7 @@ +export default defineEventHandler(async (event) => { + const result = await queryCollection(event, 'contact') + .where('extension', '=', 'json') + .first() + + return result.body +}) diff --git a/server/api/education.get.ts b/server/api/education.get.ts new file mode 100644 index 0000000..8a69b93 --- /dev/null +++ b/server/api/education.get.ts @@ -0,0 +1,15 @@ +export default defineEventHandler(async (event) => { + const result = await queryCollection(event, 'education') + .where('extension', '=', 'md') + .all() + + return result + .sort((a, b) => new Date(b.startDate).getTime() - new Date(a.startDate).getTime()) + .map(edu => ({ + degree: edu.degree, + institution: edu.institution, + startDate: edu.startDate, + endDate: edu.endDate, + location: edu.location + })) +}) diff --git a/server/api/experiences.get.ts b/server/api/experiences.get.ts new file mode 100644 index 0000000..5a038b5 --- /dev/null +++ b/server/api/experiences.get.ts @@ -0,0 +1,17 @@ +export default defineEventHandler(async (event) => { + const result = await queryCollection(event, 'experiences') + .where('extension', '=', 'md') + .all() + + return result + .sort((a, b) => new Date(b.startDate).getTime() - new Date(a.startDate).getTime()) + .map(exp => ({ + title: exp.title, + company: exp.company, + companyUrl: exp.companyUrl, + startDate: exp.startDate, + endDate: exp.endDate, + location: exp.location, + description: exp.description + })) +}) diff --git a/server/api/hobbies.get.ts b/server/api/hobbies.get.ts new file mode 100644 index 0000000..8b59eb9 --- /dev/null +++ b/server/api/hobbies.get.ts @@ -0,0 +1,7 @@ +export default defineEventHandler(async (event) => { + const result = await queryCollection(event, 'hobbies') + .where('extension', '=', 'md') + .first() + + return result.body +}) diff --git a/server/api/languages.get.ts b/server/api/languages.get.ts new file mode 100644 index 0000000..3de0ce7 --- /dev/null +++ b/server/api/languages.get.ts @@ -0,0 +1,7 @@ +export default defineEventHandler(async (event) => { + const result = await queryCollection(event, 'languages') + .where('extension', '=', 'json') + .first() + + return result.body +}) diff --git a/server/api/profile.get.ts b/server/api/profile.get.ts new file mode 100644 index 0000000..baf8e1b --- /dev/null +++ b/server/api/profile.get.ts @@ -0,0 +1,7 @@ +export default defineEventHandler(async (event) => { + const result = await queryCollection(event, 'profile') + .where('extension', '=', 'md') + .first() + + return result +}) diff --git a/server/api/projects.get.ts b/server/api/projects.get.ts new file mode 100644 index 0000000..cfcfec4 --- /dev/null +++ b/server/api/projects.get.ts @@ -0,0 +1,7 @@ +export default defineEventHandler(async (event) => { + const result = await queryCollection(event, 'projects') + .where('extension', '=', 'md') + .all() + + return result +}) diff --git a/server/api/skills.get.ts b/server/api/skills.get.ts new file mode 100644 index 0000000..02642a1 --- /dev/null +++ b/server/api/skills.get.ts @@ -0,0 +1,7 @@ +export default defineEventHandler(async (event) => { + const result = await queryCollection(event, 'skills') + .where('extension', '=', 'json') + .first() + + return result.body +}) diff --git a/server/api/uses.get.ts b/server/api/uses.get.ts new file mode 100644 index 0000000..80e80ea --- /dev/null +++ b/server/api/uses.get.ts @@ -0,0 +1,19 @@ +export default defineEventHandler(async (event) => { + const categories = await queryCollection(event, 'usesCategories') + .where('extension', '=', 'md') + .all() + + const uses = await queryCollection(event, 'uses') + .where('extension', '=', 'md') + .all() + + const uses_by_categories = [] + for (const category of categories) { + uses_by_categories.push({ + category: category, + uses: uses.filter((use: { category: unknown }) => use.category === category.slug) + }) + } + + return uses_by_categories +}) diff --git a/server/mcp/resources/contact.ts b/server/mcp/resources/contact.ts index db1d23f..7f21903 100644 --- a/server/mcp/resources/contact.ts +++ b/server/mcp/resources/contact.ts @@ -4,17 +4,13 @@ export default defineMcpResource({ uri: 'resource://artmcp/contact', cache: '1 hour', handler: async (uri: URL) => { - const event = useEvent() - - const result = await queryCollection(event, 'contact') - .where('extension', '=', 'json') - .first() + const result = await $fetch('/api/contact') return { contents: [{ uri: uri.toString(), mimeType: 'text/json', - text: JSON.stringify(result.body, null, 2) + text: JSON.stringify(result, null, 2) }] } } diff --git a/server/mcp/resources/education.ts b/server/mcp/resources/education.ts index ce6b41d..28cad3f 100644 --- a/server/mcp/resources/education.ts +++ b/server/mcp/resources/education.ts @@ -4,19 +4,7 @@ export default defineMcpResource({ uri: 'resource://artmcp/education', cache: '1 hour', handler: async (uri: URL) => { - const event = useEvent() - - const result = await queryCollection(event, 'education') - .where('extension', '=', 'md') - .select([ - 'degree', - 'institution', - 'startDate', - 'endDate', - 'location' - ]) - .orderBy('startDate', 'desc') - .all() + const result = await $fetch('/api/education') return { contents: [{ diff --git a/server/mcp/resources/experiences.ts b/server/mcp/resources/experiences.ts index 4222bfa..1b05576 100644 --- a/server/mcp/resources/experiences.ts +++ b/server/mcp/resources/experiences.ts @@ -4,21 +4,7 @@ export default defineMcpResource({ uri: 'resource://artmcp/experiences', cache: '1 hour', handler: async (uri: URL) => { - const event = useEvent() - - const result = await queryCollection(event, 'experiences') - .where('extension', '=', 'md') - .select([ - 'title', - 'company', - 'companyUrl', - 'startDate', - 'endDate', - 'location', - 'description' - ]) - .orderBy('startDate', 'desc') - .all() + const result = await $fetch('/api/experiences') return { contents: [{ diff --git a/server/mcp/resources/hobbies.ts b/server/mcp/resources/hobbies.ts index 5c7ce97..f46bcfe 100644 --- a/server/mcp/resources/hobbies.ts +++ b/server/mcp/resources/hobbies.ts @@ -4,17 +4,13 @@ export default defineMcpResource({ uri: 'resource://artmcp/hobbies', cache: '1 hour', handler: async (uri: URL) => { - const event = useEvent() - - const result = await queryCollection(event, 'hobbies') - .where('extension', '=', 'md') - .first() + const result = await $fetch('/api/hobbies') return { contents: [{ uri: uri.toString(), mimeType: 'text/json', - text: JSON.stringify(result.body, null, 2) + text: JSON.stringify(result, null, 2) }] } } diff --git a/server/mcp/resources/languages.ts b/server/mcp/resources/languages.ts index a9140ab..914f56d 100644 --- a/server/mcp/resources/languages.ts +++ b/server/mcp/resources/languages.ts @@ -4,17 +4,13 @@ export default defineMcpResource({ uri: 'resource://artmcp/languages', cache: '1 hour', handler: async (uri: URL) => { - const event = useEvent() - - const result = await queryCollection(event, 'languages') - .where('extension', '=', 'json') - .first() + const result = await $fetch('/api/languages') return { contents: [{ uri: uri.toString(), mimeType: 'text/json', - text: JSON.stringify(result.body, null, 2) + text: JSON.stringify(result, null, 2) }] } } diff --git a/server/mcp/resources/profile.ts b/server/mcp/resources/profile.ts index e70441d..0114bb3 100644 --- a/server/mcp/resources/profile.ts +++ b/server/mcp/resources/profile.ts @@ -4,11 +4,7 @@ export default defineMcpResource({ uri: 'resource://artmcp/profile', cache: '1 hour', handler: async (uri: URL) => { - const event = useEvent() - - const result = await queryCollection(event, 'profile') - .where('extension', '=', 'md') - .first() + const result = await $fetch('/api/profile') return { contents: [{ diff --git a/server/mcp/resources/projects.ts b/server/mcp/resources/projects.ts index b119a24..d963f33 100644 --- a/server/mcp/resources/projects.ts +++ b/server/mcp/resources/projects.ts @@ -4,11 +4,7 @@ export default defineMcpResource({ uri: 'resource://artmcp/projects', cache: '1 hour', handler: async (uri: URL) => { - const event = useEvent() - - const result = await queryCollection(event, 'projects') - .where('extension', '=', 'md') - .all() + const result = await $fetch('/api/projects') return { contents: [{ diff --git a/server/mcp/resources/skills.ts b/server/mcp/resources/skills.ts index e487871..4e92498 100644 --- a/server/mcp/resources/skills.ts +++ b/server/mcp/resources/skills.ts @@ -3,18 +3,14 @@ export default defineMcpResource({ description: 'A comprehensive list of technical skills, programming languages, frameworks, and tools mastered by Arthur Danjou', cache: '1 hour', uri: 'resource://artmcp/skills', - handler: async () => { - const event = useEvent() - - const result = await queryCollection(event, 'skills') - .where('extension', '=', 'json') - .first() + handler: async (uri: URL) => { + const result = await $fetch('/api/skills') return { contents: [{ - uri: result.path, + uri: uri.toString(), mimeType: 'text/json', - text: JSON.stringify(result.body, null, 2) + text: JSON.stringify(result, null, 2) }] } } diff --git a/server/mcp/resources/uses.ts b/server/mcp/resources/uses.ts index 24b2339..1881df9 100644 --- a/server/mcp/resources/uses.ts +++ b/server/mcp/resources/uses.ts @@ -4,27 +4,13 @@ export default defineMcpResource({ uri: 'resource://artmcp/uses', cache: '1 hour', handler: async (uri: URL) => { - const event = useEvent() - - const categories = await queryCollection(event, 'usesCategories').where('extension', '=', 'md').all() - - const uses = await queryCollection(event, 'uses') - .where('extension', '=', 'md') - .all() - - const uses_by_categories = [] - for (const category of categories) { - uses_by_categories.push({ - category: category, - uses: uses.filter((use: { category: unknown }) => use.category === category.slug) - }) - } + const result = await $fetch('/api/uses') return { contents: [{ uri: uri.toString(), mimeType: 'text/json', - text: JSON.stringify(uses_by_categories, null, 2) + text: JSON.stringify(result, null, 2) }] } }