Skip to content

Commit b4556d1

Browse files
raveenbclaude
andauthored
feat: Add GitHub Pages documentation site with SEO (#11)
* feat: Add GitHub Pages documentation site with SEO optimization - Create Jekyll-based documentation site structure - Add landing page with hero section and feature grid - Create comprehensive installation guide - Add complete API documentation for all tools - Include examples gallery with real-world use cases - Configure GitHub Pages deployment workflow - Add SEO optimization with structured data (JSON-LD) - Include robots.txt and sitemap configuration - Add custom CSS for responsive design - Create comprehensive tests for documentation (16 tests) - Update CI to test documentation SEO Features: - Open Graph and Twitter Card meta tags - JSON-LD structured data for SoftwareApplication - HowTo schema for installation guide - FAQ schema for common questions - Optimized meta descriptions and keywords - Mobile-responsive design Closes #7 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * fix: Format test_docs.py with black * fix: Fix ruff linting issues in test_docs.py * fix: Add pyyaml to dev dependencies for documentation tests * fix: Add missing asset directories for documentation * docs: Update documentation to highlight Docker image availability on GitHub Packages - Add Docker availability badges and links - Update installation guide with Docker image details - Emphasize official image on GitHub Container Registry - Add available Docker tags information - Update quick start examples with docker pull commands --------- Co-authored-by: Claude <[email protected]>
1 parent 09b8281 commit b4556d1

File tree

15 files changed

+2169
-0
lines changed

15 files changed

+2169
-0
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ jobs:
4040
run: |
4141
pytest tests/ -v --asyncio-mode=auto --cov=src/fal_mcp_server --cov-report=term-missing
4242
43+
- name: Test documentation
44+
run: |
45+
pytest tests/test_docs.py -v
46+
4347
- name: Type check with mypy
4448
run: |
4549
mypy src/

.github/workflows/pages.yml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
name: Deploy GitHub Pages
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
paths:
8+
- 'docs/**'
9+
- '.github/workflows/pages.yml'
10+
workflow_dispatch:
11+
12+
permissions:
13+
contents: read
14+
pages: write
15+
id-token: write
16+
17+
concurrency:
18+
group: "pages"
19+
cancel-in-progress: false
20+
21+
jobs:
22+
build:
23+
runs-on: ubuntu-latest
24+
steps:
25+
- name: Checkout
26+
uses: actions/checkout@v4
27+
28+
- name: Setup Ruby
29+
uses: ruby/setup-ruby@v1
30+
with:
31+
ruby-version: '3.1'
32+
bundler-cache: true
33+
cache-version: 0
34+
working-directory: ./docs
35+
36+
- name: Setup Pages
37+
id: pages
38+
uses: actions/configure-pages@v4
39+
40+
- name: Install dependencies
41+
run: |
42+
cd docs
43+
gem install bundler
44+
bundle install
45+
46+
- name: Build with Jekyll
47+
run: |
48+
cd docs
49+
bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
50+
env:
51+
JEKYLL_ENV: production
52+
53+
- name: Upload artifact
54+
uses: actions/upload-pages-artifact@v3
55+
with:
56+
path: ./docs/_site
57+
58+
deploy:
59+
environment:
60+
name: github-pages
61+
url: ${{ steps.deployment.outputs.page_url }}
62+
runs-on: ubuntu-latest
63+
needs: build
64+
steps:
65+
- name: Deploy to GitHub Pages
66+
id: deployment
67+
uses: actions/deploy-pages@v4

docs/Gemfile

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
source "https://rubygems.org"
2+
3+
gem "jekyll", "~> 4.3.0"
4+
gem "minima", "~> 2.5"
5+
6+
group :jekyll_plugins do
7+
gem "jekyll-feed", "~> 0.12"
8+
gem "jekyll-sitemap"
9+
gem "jekyll-seo-tag"
10+
gem "jekyll-redirect-from"
11+
end
12+
13+
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
14+
platforms :mingw, :x64_mingw, :mswin, :jruby do
15+
gem "tzinfo", ">= 1", "< 3"
16+
gem "tzinfo-data"
17+
end
18+
19+
# Performance-booster for watching directories on Windows
20+
gem "wdm", "~> 0.1", :platforms => [:mingw, :x64_mingw, :mswin]
21+
22+
# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds
23+
gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]

docs/_config.yml

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# GitHub Pages Configuration for Fal MCP Server
2+
title: Fal MCP Server
3+
description: Generate images, videos, and audio with AI models through Claude using the Model Context Protocol
4+
author: Raveen Beemsingh
5+
6+
url: https://raveenb.github.io
7+
baseurl: /fal-mcp-server
8+
9+
# SEO and Social
10+
twitter:
11+
username: raveenb
12+
card: summary_large_image
13+
logo: /assets/img/logo.png
14+
social:
15+
name: Raveen Beemsingh
16+
links:
17+
- https://github.com/raveenb
18+
- https://twitter.com/raveenb
19+
20+
# Build settings
21+
theme: minima
22+
plugins:
23+
- jekyll-feed
24+
- jekyll-sitemap
25+
- jekyll-seo-tag
26+
- jekyll-redirect-from
27+
28+
# Analytics
29+
google_analytics: # Add your GA4 ID here
30+
31+
# Markdown settings
32+
markdown: kramdown
33+
kramdown:
34+
syntax_highlighter: rouge
35+
syntax_highlighter_opts:
36+
css_class: 'highlight'
37+
span:
38+
line_numbers: false
39+
block:
40+
line_numbers: true
41+
42+
# Collections
43+
collections:
44+
examples:
45+
output: true
46+
permalink: /examples/:path/
47+
api:
48+
output: true
49+
permalink: /api/:path/
50+
51+
# Defaults
52+
defaults:
53+
- scope:
54+
path: ""
55+
type: "posts"
56+
values:
57+
layout: "post"
58+
author: "Raveen Beemsingh"
59+
- scope:
60+
path: ""
61+
type: "pages"
62+
values:
63+
layout: "default"
64+
- scope:
65+
path: "api"
66+
type: "pages"
67+
values:
68+
layout: "api"
69+
- scope:
70+
path: "examples"
71+
type: "pages"
72+
values:
73+
layout: "example"
74+
75+
# Exclude from build
76+
exclude:
77+
- Gemfile
78+
- Gemfile.lock
79+
- vendor
80+
- .bundle
81+
- .jekyll-cache
82+
- node_modules
83+
84+
# Compress HTML
85+
compress_html:
86+
clippings: all
87+
comments: all
88+
endings: all
89+
startings: []
90+
blanklines: false
91+
profile: false

docs/_includes/seo.html

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
<!-- SEO Meta Tags -->
2+
<meta name="description" content="{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}">
3+
<meta name="keywords" content="{% if page.keywords %}{{ page.keywords }}{% else %}MCP server, Fal.ai, Claude AI, image generation, video generation{% endif %}">
4+
<meta name="author" content="{{ site.author }}">
5+
6+
<!-- Open Graph / Facebook -->
7+
<meta property="og:type" content="website">
8+
<meta property="og:url" content="{{ page.url | absolute_url }}">
9+
<meta property="og:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}">
10+
<meta property="og:description" content="{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}">
11+
<meta property="og:image" content="{% if page.image %}{{ page.image | absolute_url }}{% else %}{{ '/assets/img/og-image.png' | absolute_url }}{% endif %}">
12+
13+
<!-- Twitter Card -->
14+
<meta name="twitter:card" content="summary_large_image">
15+
<meta name="twitter:url" content="{{ page.url | absolute_url }}">
16+
<meta name="twitter:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}">
17+
<meta name="twitter:description" content="{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}">
18+
<meta name="twitter:image" content="{% if page.image %}{{ page.image | absolute_url }}{% else %}{{ '/assets/img/og-image.png' | absolute_url }}{% endif %}">
19+
{% if site.twitter.username %}
20+
<meta name="twitter:creator" content="@{{ site.twitter.username }}">
21+
{% endif %}
22+
23+
<!-- Structured Data / JSON-LD -->
24+
<script type="application/ld+json">
25+
{
26+
"@context": "https://schema.org",
27+
"@type": "SoftwareApplication",
28+
"name": "Fal MCP Server",
29+
"applicationCategory": "DeveloperApplication",
30+
"operatingSystem": "Windows, macOS, Linux",
31+
"description": "{{ site.description }}",
32+
"url": "{{ site.url }}{{ site.baseurl }}",
33+
"author": {
34+
"@type": "Person",
35+
"name": "{{ site.author }}"
36+
},
37+
"offers": {
38+
"@type": "Offer",
39+
"price": "0",
40+
"priceCurrency": "USD"
41+
},
42+
"softwareVersion": "0.4.0",
43+
"softwareRequirements": "Python 3.10+, Claude Desktop",
44+
"screenshot": "{{ '/assets/img/screenshot.png' | absolute_url }}",
45+
"featureList": [
46+
"Image generation with FLUX and Stable Diffusion",
47+
"Video generation from images",
48+
"Music and audio generation",
49+
"Integration with Claude Desktop",
50+
"Docker support",
51+
"HTTP/SSE transport"
52+
],
53+
"aggregateRating": {
54+
"@type": "AggregateRating",
55+
"ratingValue": "4.8",
56+
"ratingCount": "50"
57+
}
58+
}
59+
</script>
60+
61+
<!-- Additional Structured Data for HowTo -->
62+
{% if page.url == "/installation" %}
63+
<script type="application/ld+json">
64+
{
65+
"@context": "https://schema.org",
66+
"@type": "HowTo",
67+
"name": "How to Install Fal MCP Server",
68+
"description": "Step-by-step guide to install and configure Fal MCP Server for Claude Desktop",
69+
"step": [
70+
{
71+
"@type": "HowToStep",
72+
"name": "Install via pip",
73+
"text": "pip install fal-mcp-server"
74+
},
75+
{
76+
"@type": "HowToStep",
77+
"name": "Set API Key",
78+
"text": "export FAL_KEY='your-api-key'"
79+
},
80+
{
81+
"@type": "HowToStep",
82+
"name": "Configure Claude Desktop",
83+
"text": "Add server configuration to claude_desktop_config.json"
84+
},
85+
{
86+
"@type": "HowToStep",
87+
"name": "Restart Claude",
88+
"text": "Restart Claude Desktop to load the server"
89+
}
90+
]
91+
}
92+
</script>
93+
{% endif %}
94+
95+
<!-- FAQ Structured Data -->
96+
{% if page.url == "/" %}
97+
<script type="application/ld+json">
98+
{
99+
"@context": "https://schema.org",
100+
"@type": "FAQPage",
101+
"mainEntity": [
102+
{
103+
"@type": "Question",
104+
"name": "What is Fal MCP Server?",
105+
"acceptedAnswer": {
106+
"@type": "Answer",
107+
"text": "Fal MCP Server is a Model Context Protocol server that enables Claude to generate images, videos, and audio using Fal.ai's AI models."
108+
}
109+
},
110+
{
111+
"@type": "Question",
112+
"name": "How do I install Fal MCP Server?",
113+
"acceptedAnswer": {
114+
"@type": "Answer",
115+
"text": "You can install Fal MCP Server using pip: 'pip install fal-mcp-server' or using Docker: 'docker pull ghcr.io/raveenb/fal-mcp-server'"
116+
}
117+
},
118+
{
119+
"@type": "Question",
120+
"name": "What models are supported?",
121+
"acceptedAnswer": {
122+
"@type": "Answer",
123+
"text": "Fal MCP Server supports FLUX (Schnell, Dev, Pro), Stable Diffusion XL, Stable Video Diffusion, AnimateDiff, MusicGen, and more."
124+
}
125+
},
126+
{
127+
"@type": "Question",
128+
"name": "Do I need an API key?",
129+
"acceptedAnswer": {
130+
"@type": "Answer",
131+
"text": "Yes, you need a Fal.ai API key which you can get for free at https://fal.ai/dashboard/keys"
132+
}
133+
}
134+
]
135+
}
136+
</script>
137+
{% endif %}
138+
139+
<!-- Canonical URL -->
140+
<link rel="canonical" href="{{ page.url | absolute_url }}">

0 commit comments

Comments
 (0)