13 KiB
ArtAPI - Arthur Danjou's Portfolio API
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?
- API Endpoints
- Getting Started
- Architecture
- MCP Server Component
- Development
- Content Structure
- Troubleshooting & FAQ
- Contributing
- License
- About
💡 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 goalsGET /api/contact- Professional contact information and social linksGET /api/skills- Complete list of technical skills (programming languages, frameworks, tools)GET /api/languages- Spoken languages with proficiency levelsGET /api/hobbies- Personal interests and activities
Professional Experience
GET /api/experiences- Professional work experience and projectsGET /api/projects- Portfolio of personal and professional projectsGET /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 WakaTimeGET /api/status-page- Homelab infrastructure status and uptime monitoring
Tools & Resources
GET /api/uses- Tools, hardware, and software setupGET /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 loginto 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 statusresume-link- Get resume download link (English/French)stats- Retrieve WakaTime coding statisticsstatus-page- Check homelab infrastructure statususes-by-category- Filter tools by categoryweather- 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:
- Add a new experience: Create a markdown file in
content/experiences/ - Add a new project: Create a markdown file in
content/projects/ - Update skills: Edit
content/skills.json - 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_modulesandbun.lockb, then runbun installagain - Check if port 3000 is already in use
Q: Environment variables not working
- Copy
.env.exampleto.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
.nuxtand.outputdirectories
Q: MCP endpoint returns 404
- Ensure the
@nuxtjs/mcp-toolkitmodule is properly installed - Check that
browserRedirectis configured innuxt.config.ts - The MCP endpoint should redirect to
/docswhen accessed via browser
Q: Deployment to Cloudflare fails
- Verify Cloudflare credentials are configured with
wrangler login - Check
wrangler.jsoncfor proper configuration - Ensure you have the necessary permissions on your Cloudflare account
Getting Help
- 📖 Check the documentation page
- 🐛 Open an issue on GitHub
- 💬 Review existing issues for similar problems
🤝 Contributing
This is a personal portfolio project. However, contributions are welcome!
How to Contribute
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes and commit:
git commit -m 'Add amazing feature' - Push to your branch:
git push origin feature/amazing-feature - 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:
- Update content in the
content/directory - Modify
nuxt.config.tswith your settings - Update environment variables for integrations (Discord, WakaTime, etc.)
- 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
- 🐙 GitHub
Built with ❤️ using Nuxt and the Model Context Protocol