From 01f8ec098e9503336e5a84f659ee13bdc0ac7243 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 21:52:15 +0000 Subject: [PATCH] Add comprehensive profile enhancements: languages, certifications, profile info, and fix duplicate resource ID bug Co-authored-by: ArthurDanjou <29738535+ArthurDanjou@users.noreply.github.com> --- content.config.ts | 52 +++++++++++++- content/certifications.json | 20 ++++++ content/languages.json | 19 +++++ content/profile.json | 32 +++++++++ server/api/certifications.get.ts | 10 +++ server/api/languages.get.ts | 10 +++ server/api/profile.get.ts | 10 +++ server/routes/mcp.ts | 116 ++++++++++++++++++++++++++++++- 8 files changed, 267 insertions(+), 2 deletions(-) create mode 100644 content/certifications.json create mode 100644 content/languages.json create mode 100644 content/profile.json create mode 100644 server/api/certifications.get.ts create mode 100644 server/api/languages.get.ts create mode 100644 server/api/profile.get.ts diff --git a/content.config.ts b/content.config.ts index 0958c7c..13b02b5 100644 --- a/content.config.ts +++ b/content.config.ts @@ -79,13 +79,63 @@ export default defineContentConfig({ schema: z.object({ body: z.array(z.object({ name: z.string(), - url: z.string().url() + icon: z.string().optional(), + value: z.string().url() })) }) }), hobbies: defineCollection({ type: 'page', source: 'hobbies.md' + }), + languages: defineCollection({ + type: 'page', + source: 'languages.json', + schema: z.object({ + body: z.array(z.object({ + name: z.string(), + level: z.string(), + proficiency: z.string() + })) + }) + }), + certifications: defineCollection({ + type: 'page', + source: 'certifications.json', + schema: z.object({ + body: z.array(z.object({ + name: z.string(), + issuer: z.string(), + date: z.string(), + url: z.string().url().optional() + })) + }) + }), + profile: defineCollection({ + type: 'page', + source: 'profile.json', + schema: z.object({ + shortBio: z.string(), + location: z.object({ + current: z.string(), + timezone: z.string(), + remote: z.boolean() + }), + availability: z.object({ + status: z.string(), + types: z.array(z.string()), + preferences: z.array(z.string()), + startDate: z.string().optional() + }), + careerGoals: z.array(z.string()), + workPreferences: z.object({ + workStyle: z.array(z.string()), + companySize: z.array(z.string()), + industries: z.array(z.string()), + roles: z.array(z.string()) + }), + achievements: z.array(z.string()) + }) }) } }) diff --git a/content/certifications.json b/content/certifications.json new file mode 100644 index 0000000..39cd33f --- /dev/null +++ b/content/certifications.json @@ -0,0 +1,20 @@ +{ + "body": [ + { + "name": "Git & GitHub", + "issuer": "GitHub Learning Lab", + "date": "2021-06", + "url": "https://github.com" + }, + { + "name": "Docker Essentials", + "issuer": "Self-taught through practical experience", + "date": "2021-09" + }, + { + "name": "Machine Learning Specialization", + "issuer": "Various academic courses", + "date": "2024-09" + } + ] +} diff --git a/content/languages.json b/content/languages.json new file mode 100644 index 0000000..0650548 --- /dev/null +++ b/content/languages.json @@ -0,0 +1,19 @@ +{ + "body": [ + { + "name": "French", + "level": "Native", + "proficiency": "C2" + }, + { + "name": "English", + "level": "Fluent", + "proficiency": "C1" + }, + { + "name": "Spanish", + "level": "Intermediate", + "proficiency": "B1" + } + ] +} diff --git a/content/profile.json b/content/profile.json new file mode 100644 index 0000000..a0d4b1e --- /dev/null +++ b/content/profile.json @@ -0,0 +1,32 @@ +{ + "shortBio": "Software Engineer & Mathematics Student passionate about AI, Data Science, and Infrastructure. Building scalable solutions at the intersection of theory and practice.", + "location": { + "current": "Paris, France", + "timezone": "Europe/Paris (CET/CEST)", + "remote": true + }, + "availability": { + "status": "open_to_opportunities", + "types": ["internship", "full-time", "part-time", "freelance"], + "preferences": ["remote", "hybrid"], + "startDate": "2025-06" + }, + "careerGoals": [ + "Become an expert in Machine Learning Engineering and MLOps", + "Contribute to open-source AI/ML projects", + "Build scalable data infrastructure for real-world applications", + "Combine mathematical rigor with practical engineering solutions" + ], + "workPreferences": { + "workStyle": ["remote", "hybrid"], + "companySize": ["startup", "scale-up", "enterprise"], + "industries": ["AI/ML", "Data Science", "FinTech", "SaaS", "DevOps"], + "roles": ["Machine Learning Engineer", "Data Engineer", "Software Engineer", "MLOps Engineer"] + }, + "achievements": [ + "Built and maintained personal homelab with 10+ self-hosted services", + "Developed mini-games for Erisium, one of the largest French-speaking Minecraft servers", + "Created multiple full-stack applications using modern web technologies", + "Active contributor to various technical projects and communities" + ] +} diff --git a/server/api/certifications.get.ts b/server/api/certifications.get.ts new file mode 100644 index 0000000..4ac26d3 --- /dev/null +++ b/server/api/certifications.get.ts @@ -0,0 +1,10 @@ +import { queryCollection } from '@nuxt/content/server' + +export default defineCachedEventHandler(async (event) => { + return await queryCollection(event, 'certifications') + .where('extension', '=', 'json') + .first() +}, { + name: 'certifications-list', + maxAge: 3600 // 1 hour +}) diff --git a/server/api/languages.get.ts b/server/api/languages.get.ts new file mode 100644 index 0000000..665bda8 --- /dev/null +++ b/server/api/languages.get.ts @@ -0,0 +1,10 @@ +import { queryCollection } from '@nuxt/content/server' + +export default defineCachedEventHandler(async (event) => { + return await queryCollection(event, 'languages') + .where('extension', '=', 'json') + .first() +}, { + name: 'languages-list', + maxAge: 3600 // 1 hour +}) diff --git a/server/api/profile.get.ts b/server/api/profile.get.ts new file mode 100644 index 0000000..6f08f28 --- /dev/null +++ b/server/api/profile.get.ts @@ -0,0 +1,10 @@ +import { queryCollection } from '@nuxt/content/server' + +export default defineCachedEventHandler(async (event) => { + return await queryCollection(event, 'profile') + .where('extension', '=', 'json') + .first() +}, { + name: 'profile-info', + maxAge: 3600 // 1 hour +}) diff --git a/server/routes/mcp.ts b/server/routes/mcp.ts index 9c7a769..8e43ed4 100644 --- a/server/routes/mcp.ts +++ b/server/routes/mcp.ts @@ -162,7 +162,7 @@ function createServer() { ) server.registerResource( - 'artmcp-contact', + 'artmcp-hobbies', 'resource://artmcp/hobbies', { title: 'ArtMCP Hobbies', @@ -199,6 +199,63 @@ function createServer() { } ) + server.registerResource( + 'artmcp-languages', + 'resource://artmcp/languages', + { + title: 'ArtMCP Languages', + description: 'Get Languages spoken by Arthur Danjou with proficiency levels' + }, + async (uri) => { + const result = await $fetch('/api/languages') + return { + contents: [{ + uri: uri.href, + mimeType: 'application/json', + text: JSON.stringify(result, null, 2) + }] + } + } + ) + + server.registerResource( + 'artmcp-certifications', + 'resource://artmcp/certifications', + { + title: 'ArtMCP Certifications', + description: 'Get Certifications and achievements of Arthur Danjou' + }, + async (uri) => { + const result = await $fetch('/api/certifications') + return { + contents: [{ + uri: uri.href, + mimeType: 'application/json', + text: JSON.stringify(result, null, 2) + }] + } + } + ) + + server.registerResource( + 'artmcp-profile', + 'resource://artmcp/profile', + { + title: 'ArtMCP Profile', + description: 'Get comprehensive profile information of Arthur Danjou including bio, location, availability, career goals, and work preferences' + }, + async (uri) => { + const result = await $fetch('/api/profile') + return { + contents: [{ + uri: uri.href, + mimeType: 'application/json', + text: JSON.stringify(result, null, 2) + }] + } + } + ) + // Tools server.registerTool( 'get_resume_link', @@ -420,6 +477,63 @@ function createServer() { } ) + server.registerPrompt( + 'artmcp-languages', + { + title: 'Get Languages of Arthur Danjou', + description: 'Get Languages spoken by Arthur Danjou with proficiency levels' + }, + async () => { + return { + messages: [{ + role: 'user', + content: { + type: 'text', + text: `What languages does Arthur Danjou speak and at what proficiency level?` + } + }] + } + } + ) + + server.registerPrompt( + 'artmcp-certifications', + { + title: 'Get Certifications of Arthur Danjou', + description: 'Get Certifications and achievements of Arthur Danjou' + }, + async () => { + return { + messages: [{ + role: 'user', + content: { + type: 'text', + text: `What certifications and professional achievements does Arthur Danjou have?` + } + }] + } + } + ) + + server.registerPrompt( + 'artmcp-profile', + { + title: 'Get Profile Information of Arthur Danjou', + description: 'Get comprehensive profile information including bio, location, availability, and career goals' + }, + async () => { + return { + messages: [{ + role: 'user', + content: { + type: 'text', + text: `Provide me comprehensive profile information about Arthur Danjou including his bio, location, availability, career goals, and work preferences.` + } + }] + } + } + ) + return server }