2025-11-12 16:12:56 +01:00
2025-11-12 16:12:56 +01:00

ArtAPI - Arthur Danjou's Portfolio API

Nuxt License Deployment MCP

A comprehensive REST API exposing professional profile information about Arthur Danjou. Built with Nuxt and deployed on NuxtHub at the Edge. The API powers Arthur's portfolio and includes a Model Context Protocol (MCP) server component for AI assistant integration.

🔗 Base URL: https://api.arthurdanjou.fr 📚 Documentation: https://api.arthurdanjou.fr/docs 🤖 MCP Server: https://api.arthurdanjou.fr/mcp


📋 Table of Contents


💡 What is ArtAPI?

ArtAPI is a comprehensive REST API that serves as the backend for Arthur Danjou's portfolio. It provides structured access to professional information including skills, experiences, projects, education, and real-time activity data. The API is designed to power portfolio websites, applications, and integrations.

Key Features:

  • 📊 Portfolio Data: Complete professional profile, skills, experiences, and projects
  • 🎓 Education & Background: Academic history and achievements
  • Real-time Data: Current activity status and coding statistics via integrations
  • 📄 Resume Access: Download resumes in multiple languages
  • 🤖 MCP Integration: Optional Model Context Protocol server for AI assistant access
  • 🌐 RESTful Design: Clean, well-documented API endpoints

Use Cases:

  • 🌐 Power portfolio websites and applications
  • 📱 Build mobile apps showcasing professional information
  • 🤖 Enable AI assistants to answer questions about Arthur's experience
  • 📊 Display real-time coding statistics and activity dashboards
  • 🔍 Query specific information programmatically for integrations

📚 API Endpoints

All API endpoints are available at the base URL: https://api.arthurdanjou.fr

Profile & Information

  • GET /api/profile - Comprehensive profile with bio, location, availability, career goals
  • GET /api/contact - Professional contact information and social links
  • GET /api/skills - Complete list of technical skills (programming languages, frameworks, tools)
  • GET /api/languages - Spoken languages with proficiency levels
  • GET /api/hobbies - Personal interests and activities

Professional Experience

  • GET /api/experiences - Professional work experience and projects
  • GET /api/projects - Portfolio of personal and professional projects
  • GET /api/education - Academic background and degrees

Real-time Data

  • GET /api/activity - Current activity and status (Discord integration)
  • GET /api/wakatime - Detailed coding statistics and analytics from WakaTime
  • GET /api/status-page - Homelab infrastructure status and uptime monitoring

Tools & Resources

  • GET /api/uses - Tools, hardware, and software setup
  • GET /api/resumes/{en|fr} - Download resume in English or French

Example Usage

# Get profile information
curl https://api.arthurdanjou.fr/api/profile

# Get technical skills
curl https://api.arthurdanjou.fr/api/skills

# Get current activity
curl https://api.arthurdanjou.fr/api/activity

# Download English resume
curl -O https://api.arthurdanjou.fr/api/resumes/en

Example Response

{
  "name": "Arthur Danjou",
  "title": "Data Science & Applied AI Student",
  "location": "Paris, France",
  "availability": "Available for final-year internship (April 2026)",
  "bio": "Rigorous, curious, and motivated...",
  ...
}

🚀 Getting Started

Prerequisites

  • Bun 1.0+ (JavaScript runtime and package manager)
  • Alternatively: Node.js 18+ with pnpm 10.12.1+

Note: This project uses Bun as the primary runtime and package manager. Node.js with pnpm can be used as an alternative.

Installation

# Clone the repository
git clone https://github.com/ArthurDanjou/artapi.git
cd artapi

# Install dependencies
bun install

Environment Variables

Create a .env file (optional):

# 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

Start the development server on http://localhost:3000:

bun dev

The server will be available at:

  • 🌐 Web Interface: http://localhost:3000
  • 📚 Documentation: http://localhost:3000/docs
  • 🔌 MCP Endpoint: http://localhost:3000/mcp

Production

Build the application for production:

bun run build

Preview the production build locally:

bun preview

Deployment

Deploy to NuxtHub/Cloudflare:

# First time: Login to Cloudflare
wrangler login

# Deploy the application
bun deploy

Note: Make sure you have proper Cloudflare credentials configured. Run wrangler login to authenticate if this is your first deployment.

🏗️ Architecture

ArtAPI is built with modern web technologies and follows a serverless architecture:

Core Stack:

  • Nuxt 4 - Full-stack framework with Nitro for server-side rendering and API routes
  • Vue 3 - Frontend framework (for documentation pages)
  • Cloudflare Workers - Edge deployment via NuxtHub for global low-latency access
  • TypeScript - Type-safe development

Data & Content:

  • Nuxt Content - Content management with markdown and JSON files
  • Cloudflare D1 - SQLite-compatible database for content queries in production
  • Zod - Schema validation for API responses

Additional Features:

  • @nuxtjs/mcp-toolkit - Model Context Protocol server implementation
  • nuxt-studio - Content management studio interface
  • Discord/WakaTime APIs - Real-time integrations for activity and stats

Architecture Benefits:

  • Fast: Edge deployment on Cloudflare's global network
  • 🔒 Type-safe: Full TypeScript coverage
  • 📝 Content-first: Easy to update via markdown/JSON files
  • 🌐 Multi-protocol: REST API + MCP server in one package
  • 🚀 Scalable: Serverless architecture with automatic scaling

🤖 MCP Server Component

In addition to the REST API, ArtAPI includes a Model Context Protocol (MCP) server component that enables AI assistants and MCP-compatible applications to access the same data through the MCP protocol.

MCP Endpoint: https://api.arthurdanjou.fr/mcp

Why MCP?

The MCP server allows AI assistants (like Claude Desktop, Cline, etc.) to directly query Arthur's professional information, making it easy to:

  • Answer questions about experience and skills
  • Generate customized resumes and cover letters
  • Access real-time activity and coding statistics
  • Query specific information through natural language

MCP Resources

The MCP server exposes all API data as resources:

  • 📊 Skills (resource://artmcp/skills) - Technical skills and tools
  • 💼 Experiences (resource://artmcp/experiences) - Work experience
  • 🚀 Projects (resource://artmcp/projects) - Project portfolio
  • 🎓 Education (resource://artmcp/education) - Academic background
  • 🌐 Languages (resource://artmcp/languages) - Spoken languages
  • 👤 Profile (resource://artmcp/profile) - Complete profile
  • 🎨 Hobbies (resource://artmcp/hobbies) - Personal interests
  • 📞 Contact (resource://artmcp/contact) - Contact information
  • 🛠️ Uses (resource://artmcp/uses) - Tech stack and tools

MCP Tools

Dynamic tools for AI assistants:

  • activity - Get current real-time activity status
  • resume-link - Get resume download link (English/French)
  • stats - Retrieve WakaTime coding statistics
  • status-page - Check homelab infrastructure status
  • uses-by-category - Filter tools by category
  • weather - Get weather for a city

Connecting via MCP

Option 1: Direct URL

https://api.arthurdanjou.fr/mcp

Option 2: Configuration File

Add to your MCP client configuration:

{
  "mcpServers": {
    "artapi": {
      "url": "https://api.arthurdanjou.fr/mcp"
    }
  }
}

Usage Examples:

"Show me Arthur's technical skills"
"What is Arthur currently working on?"
"Get Arthur's resume in French"

🧪 Development

Linting

Check and fix code style issues:

# Run ESLint
bun lint

# Auto-fix issues where possible
bun lint --fix

Type Checking

Verify TypeScript types:

# Type check without emitting files
npx tsc --noEmit --skipLibCheck

# Or use Vue's type checker
npx vue-tsc --noEmit

Adding Content

Content is managed in the content/ directory. To add new items:

  1. Add a new experience: Create a markdown file in content/experiences/
  2. Add a new project: Create a markdown file in content/projects/
  3. Update skills: Edit content/skills.json
  4. Update profile: Edit content/profile.md

Content changes are automatically picked up by Nuxt Content and reflected in the API.

📂 Content Structure

Content is managed in the content/ directory:

content/
├── skills.json              # Technical skills
├── languages.json           # Spoken languages
├── profile.md               # Comprehensive profile info
├── contact.json             # Contact information
├── hobbies.md               # Personal interests
├── documentation.md         # MCP documentation
├── experiences/*.md         # Work experiences
├── projects/*.md            # Project portfolio
├── education/*.md           # Academic background
└── uses/*.md                # Tools and setup

Troubleshooting & FAQ

Common Issues

Q: The development server won't start

  • Ensure you have Bun 1.0+ installed
  • Try removing node_modules and bun.lockb, then run bun install again
  • Check if port 3000 is already in use

Q: Environment variables not working

  • Copy .env.example to .env
  • Ensure all required variables are set (though most are optional)
  • Restart the development server after changing .env

Q: Content changes not reflecting

  • The Nuxt Content module caches content. Try restarting the dev server
  • For production builds, clear the .nuxt and .output directories

Q: MCP endpoint returns 404

  • Ensure the @nuxtjs/mcp-toolkit module is properly installed
  • Check that browserRedirect is configured in nuxt.config.ts
  • The MCP endpoint should redirect to /docs when accessed via browser

Q: Deployment to Cloudflare fails

  • Verify Cloudflare credentials are configured with wrangler login
  • Check wrangler.jsonc for proper configuration
  • Ensure you have the necessary permissions on your Cloudflare account

Getting Help

🤝 Contributing

This is a personal portfolio project. However, contributions are welcome!

How to Contribute

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Make your changes and commit: git commit -m 'Add amazing feature'
  4. Push to your branch: git push origin feature/amazing-feature
  5. Open a Pull Request

Ideas for Contributions

  • 🐛 Bug fixes
  • 📝 Documentation improvements
  • New MCP tools or resources
  • 🎨 UI/UX enhancements for the docs page
  • 🔧 Performance optimizations

Code Style

This project uses:

  • ESLint for code linting (single quotes, no trailing commas)
  • TypeScript for type safety
  • Vue 3 Composition API

Run bun lint before submitting PRs.

Using as a Template

Feel free to fork this project and adapt it for your own professional profile! Just:

  1. Update content in the content/ directory
  2. Modify nuxt.config.ts with your settings
  3. Update environment variables for integrations (Discord, WakaTime, etc.)
  4. Deploy to your own Cloudflare account

📝 License

Private project - All rights reserved

👤 About

Arthur Danjou

  • Data Science & Applied AI student at Paris Dauphine-PSL University, passionate about machine learning and mathematical modelling
  • 📍 Paris, France
  • 🔗 LinkedIn
  • 🐙 GitHub
  • 📧 Email

Built with ❤️ using Nuxt and the Model Context Protocol

Description
No description provided
Readme 5.8 MiB
Languages
TypeScript 71%
Vue 28.4%
JavaScript 0.4%
CSS 0.2%