From cbc93091e5bcfc7e1cf8d3837b9d29166be2d317 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 21:54:40 +0000 Subject: [PATCH] Add social links resource and update README with comprehensive documentation Co-authored-by: ArthurDanjou <29738535+ArthurDanjou@users.noreply.github.com> --- README.md | 195 +++++++++++++++++++++++++++++++++----- content.config.ts | 27 ++++++ content/socials.json | 23 +++++ server/api/socials.get.ts | 10 ++ server/routes/mcp.ts | 38 ++++++++ 5 files changed, 270 insertions(+), 23 deletions(-) create mode 100644 content/socials.json create mode 100644 server/api/socials.get.ts diff --git a/README.md b/README.md index b94a89b..379f611 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,89 @@ -# Hello Edge +# ArtMCP - Arthur Danjou's MCP Server -A minimal [Nuxt](https://nuxt.com) starter deployed on the Edge using [NuxtHub](https://hub.nuxt.com). +A comprehensive [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server exposing professional profile information about Arthur Danjou. Built with [Nuxt](https://nuxt.com) and deployed on [NuxtHub](https://hub.nuxt.com) at the Edge. -https://hello.nuxt.dev +๐Ÿ”— **Live Server**: https://mcp.arthurdanjou.fr - -Hello World template for NuxtHub - +## ๐ŸŽฏ Features -## Features +### MCP Resources -- Server-Side rendering on Cloudflare Workers -- ESLint setup -- Ready to add a database, blob and KV storage -- One click deploy on 275+ locations for free +The server exposes the following resources through the Model Context Protocol: -## Setup +- **๐Ÿ“Š Skills** (`resource://artmcp/skills`) - Complete list of technical skills (programming languages, frameworks, tools) +- **๐Ÿ’ผ Experiences** (`resource://artmcp/experiences`) - Professional work experience and projects +- **๐Ÿš€ Projects** (`resource://artmcp/projects`) - Portfolio of personal and professional projects +- **๐ŸŽ“ Education** (`resource://artmcp/education`) - Academic background and degrees +- **๐ŸŒ Languages** (`resource://artmcp/languages`) - Spoken languages with proficiency levels +- **๐Ÿ† Certifications** (`resource://artmcp/certifications`) - Professional certifications and achievements +- **๐Ÿ‘ค Profile** (`resource://artmcp/profile`) - Comprehensive profile with bio, location, availability, career goals, and work preferences +- **๐ŸŽจ Hobbies** (`resource://artmcp/hobbies`) - Personal interests and activities +- **๐Ÿ“ž Contact** (`resource://artmcp/contact`) - Professional contact information and social links +- **๐Ÿ› ๏ธ Uses** (`resource://artmcp/uses`) - Tools, hardware, and software setup +- **๐Ÿ“ˆ Activity** (`resource://artmcp/activity`) - Real-time coding activity (Discord integration) +- **โฑ๏ธ Wakatime** (`resource://artmcp/wakatime`) - Coding statistics powered by Wakatime +- **๐Ÿ  Status Page** (`resource://artmcp/status_page`) - Homelab services uptime and incidents -Make sure to install the dependencies with [pnpm](https://pnpm.io/installation#using-corepack): +### MCP Tools + +- **`get_resume_link`** - Get download link for resume in English or French +- **`get_uses_by_category`** - Filter uses by category (homelab, ide, hardware, software) + +### MCP Prompts + +Pre-configured prompts for common queries about: +- Resume generation +- Skills and expertise +- Projects showcase +- Real-time activity +- Contact information +- And more... + +## ๐Ÿ—๏ธ Architecture + +This project uses: +- **Nuxt 4** with Nitro for server-side rendering +- **@nuxt/content** for content management +- **@modelcontextprotocol/sdk** for MCP server implementation +- **NuxtHub** for edge deployment on Cloudflare Workers +- **Zod** for schema validation + +## ๐Ÿš€ Getting Started + +### Prerequisites + +- Node.js 18+ or Bun +- pnpm 10.12.1+ + +### Installation ```bash +# Install dependencies pnpm install ``` -You can update the main text displayed by creating a `.env`: +### Environment Variables + +Create a `.env` file (optional): ```bash -NUXT_PUBLIC_HELLO_TEXT="Hello my world!" +# Discord integration (optional) +NUXT_DISCORD_USER_ID="" +NUXT_DISCORD_ID="" +NUXT_DISCORD_TOKEN="" + +# Wakatime integration (optional) +NUXT_WAKATIME_USER_ID="" +NUXT_WAKATIME_CODING="" +NUXT_WAKATIME_EDITORS="" +NUXT_WAKATIME_LANGUAGES="" +NUXT_WAKATIME_OS="" + +# Status page (optional) +NUXT_STATUS_PAGE="" ``` -## Development Server +### Development Start the development server on `http://localhost:3000`: @@ -37,7 +91,7 @@ Start the development server on `http://localhost:3000`: pnpm dev ``` -## Production +### Production Build the application for production: @@ -45,16 +99,111 @@ Build the application for production: pnpm build ``` -## Deploy +### Deployment - -Deploy the application on the Edge with [NuxtHub](https://hub.nuxt.com) on your Cloudflare account: +Deploy to NuxtHub/Cloudflare: ```bash -npx nuxthub deploy +pnpm deploy ``` -Then checkout your server logs, analaytics and more in the [NuxtHub Admin](https://admin.hub.nuxt.com). +## ๐Ÿ“š API Endpoints -You can also deploy using [Cloudflare Pages CI](https://hub.nuxt.com/docs/getting-started/deploy#cloudflare-pages-ci). +All resources are also available as REST API endpoints: + +- `GET /api/skills` +- `GET /api/experiences` +- `GET /api/projects` +- `GET /api/educations` +- `GET /api/languages` +- `GET /api/certifications` +- `GET /api/profile` +- `GET /api/hobbies` +- `GET /api/contact` +- `GET /api/uses` +- `GET /api/uses_by_category?categoryName={category}` +- `GET /api/activity` +- `GET /api/wakatime` +- `GET /api/status_page` +- `GET /api/resumes/{en|fr}` - Download resume + +## ๐Ÿงช Development + +### Linting + +```bash +pnpm lint +``` + +### Type Checking + +```bash +npx tsc --noEmit --skipLibCheck +``` + +## ๐Ÿ“‚ Content Structure + +Content is managed in the `content/` directory: + +``` +content/ +โ”œโ”€โ”€ skills.json # Technical skills +โ”œโ”€โ”€ languages.json # Spoken languages +โ”œโ”€โ”€ certifications.json # Professional certifications +โ”œโ”€โ”€ profile.json # Comprehensive profile info +โ”œโ”€โ”€ contact.json # Contact information +โ”œโ”€โ”€ hobbies.md # Personal interests +โ”œโ”€โ”€ experiences/*.md # Work experiences +โ”œโ”€โ”€ projects/*.md # Project portfolio +โ”œโ”€โ”€ education/*.md # Academic background +โ””โ”€โ”€ uses/*.md # Tools and setup +``` + +## ๐Ÿ”ง Technologies + +- **Frontend/Backend**: Nuxt 4, Vue 3, Nitro +- **MCP**: Model Context Protocol SDK +- **Content**: Nuxt Content with better-sqlite3 +- **Styling**: TailwindCSS (ready to add) +- **Deployment**: Cloudflare Workers via NuxtHub +- **Validation**: Zod schemas + +## ๐Ÿ“– MCP Integration + +To use this server with an MCP client: + +1. Configure your MCP client to connect to `https://mcp.arthurdanjou.fr/mcp` +2. Or use the API directly via REST endpoints + +Example MCP client configuration: +```json +{ + "mcpServers": { + "artmcp": { + "url": "https://mcp.arthurdanjou.fr/mcp" + } + } +} +``` + +## ๐Ÿค Contributing + +This is a personal portfolio project. Feel free to use it as inspiration for your own MCP server! + +## ๐Ÿ“ License + +Private project - All rights reserved + +## ๐Ÿ‘ค About + +**Arthur Danjou** +- Software Engineer & Mathematics Student +- ๐Ÿ“ Paris, France +- ๐Ÿ”— [LinkedIn](https://go.arthurdanjou.fr/linkedin) +- ๐Ÿ™ [GitHub](https://go.arthurdanjou.fr/github) +- ๐Ÿ“ง [Email](https://go.arthurdanjou.fr/mail-pro) + +--- + +Built with โค๏ธ using Nuxt and the Model Context Protocol diff --git a/content.config.ts b/content.config.ts index 13b02b5..d8efc97 100644 --- a/content.config.ts +++ b/content.config.ts @@ -136,6 +136,33 @@ export default defineContentConfig({ }), achievements: z.array(z.string()) }) + }), + socials: defineCollection({ + type: 'page', + source: 'socials.json', + schema: z.object({ + github: z.object({ + username: z.string(), + url: z.string().url(), + stats: z.object({ + note: z.string() + }) + }), + linkedin: z.object({ + url: z.string().url() + }), + twitter: z.object({ + url: z.string().url() + }), + discord: z.object({ + url: z.string().url() + }), + website: z.object({ + personal: z.string().url(), + mcp: z.string().url(), + status: z.string().url() + }) + }) }) } }) diff --git a/content/socials.json b/content/socials.json new file mode 100644 index 0000000..cdc6370 --- /dev/null +++ b/content/socials.json @@ -0,0 +1,23 @@ +{ + "github": { + "username": "ArthurDanjou", + "url": "https://go.arthurdanjou.fr/github", + "stats": { + "note": "Real-time stats available via GitHub API" + } + }, + "linkedin": { + "url": "https://go.arthurdanjou.fr/linkedin" + }, + "twitter": { + "url": "https://go.arthurdanjou.fr/twitter" + }, + "discord": { + "url": "https://go.arthurdanjou.fr/discord" + }, + "website": { + "personal": "https://arthurdanjou.fr", + "mcp": "https://mcp.arthurdanjou.fr", + "status": "https://go.arthurdanjou.fr/status" + } +} diff --git a/server/api/socials.get.ts b/server/api/socials.get.ts new file mode 100644 index 0000000..c9b4692 --- /dev/null +++ b/server/api/socials.get.ts @@ -0,0 +1,10 @@ +import { queryCollection } from '@nuxt/content/server' + +export default defineCachedEventHandler(async (event) => { + return await queryCollection(event, 'socials') + .where('extension', '=', 'json') + .first() +}, { + name: 'socials-list', + maxAge: 3600 // 1 hour +}) diff --git a/server/routes/mcp.ts b/server/routes/mcp.ts index 8e43ed4..be3d24e 100644 --- a/server/routes/mcp.ts +++ b/server/routes/mcp.ts @@ -256,6 +256,25 @@ function createServer() { } ) + server.registerResource( + 'artmcp-socials', + 'resource://artmcp/socials', + { + title: 'ArtMCP Social Links', + description: 'Get social media profiles and online presence of Arthur Danjou' + }, + async (uri) => { + const result = await $fetch('/api/socials') + return { + contents: [{ + uri: uri.href, + mimeType: 'application/json', + text: JSON.stringify(result, null, 2) + }] + } + } + ) + // Tools server.registerTool( 'get_resume_link', @@ -534,6 +553,25 @@ function createServer() { } ) + server.registerPrompt( + 'artmcp-socials', + { + title: 'Get Social Media Links of Arthur Danjou', + description: 'Get social media profiles and online presence' + }, + async () => { + return { + messages: [{ + role: 'user', + content: { + type: 'text', + text: `What are Arthur Danjou's social media profiles and online presence?` + } + }] + } + } + ) + return server }