Add API endpoints for content and update MCP resources to use them

Co-authored-by: ArthurDanjou <29738535+ArthurDanjou@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2025-11-30 14:44:52 +00:00
parent 377cab77ed
commit f6ab805ef3
18 changed files with 109 additions and 80 deletions

View File

@@ -0,0 +1,7 @@
export default defineEventHandler(async (event) => {
const result = await queryCollection(event, 'contact')
.where('extension', '=', 'json')
.first()
return result.body
})

View File

@@ -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
}))
})

View File

@@ -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
}))
})

View File

@@ -0,0 +1,7 @@
export default defineEventHandler(async (event) => {
const result = await queryCollection(event, 'hobbies')
.where('extension', '=', 'md')
.first()
return result.body
})

View File

@@ -0,0 +1,7 @@
export default defineEventHandler(async (event) => {
const result = await queryCollection(event, 'languages')
.where('extension', '=', 'json')
.first()
return result.body
})

View File

@@ -0,0 +1,7 @@
export default defineEventHandler(async (event) => {
const result = await queryCollection(event, 'profile')
.where('extension', '=', 'md')
.first()
return result
})

View File

@@ -0,0 +1,7 @@
export default defineEventHandler(async (event) => {
const result = await queryCollection(event, 'projects')
.where('extension', '=', 'md')
.all()
return result
})

7
server/api/skills.get.ts Normal file
View File

@@ -0,0 +1,7 @@
export default defineEventHandler(async (event) => {
const result = await queryCollection(event, 'skills')
.where('extension', '=', 'json')
.first()
return result.body
})

19
server/api/uses.get.ts Normal file
View File

@@ -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
})

View File

@@ -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)
}]
}
}

View File

@@ -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: [{

View File

@@ -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: [{

View File

@@ -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)
}]
}
}

View File

@@ -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)
}]
}
}

View File

@@ -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: [{

View File

@@ -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: [{

View File

@@ -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)
}]
}
}

View File

@@ -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)
}]
}
}