Skip to main content
Glama

mcp-movingimagearchive

MCP server for Moving Image Archive: a searchable library of shots cut from public-domain archival films, all free to reuse. Inspired by a reply from the site's creator, Cova, welcoming the idea of an MCP server for it. This is an unofficial project.

Tools

Tool

What it does

Site equivalent

search_clips

Semantic shot search by visual description, with color / aspect ratio / year filters. Empty query browses every shot.

Search box + Filter

list_sources

All source films, sorted featured / recent / by title (direction: "asc" for A–Z; the default desc gives Z–A), plus archive totals

Gallery

get_source

One film: synopsis, provenance & rights, full-film URL, shot list with per-shot URLs

/sources/<slug>

list_collections

Curated themed collections

Collections

get_collection

Shots in one collection

/collection/<slug>

download

Save a single shot, the full film, or a shot/time range (trimmed with ffmpeg) to a local MP4. Defaults to ~/Downloads, never overwrites, cancellable

Download buttons, shift-click range download

Every shot result includes clipDownloadUrl (the shot MP4) and sourceDownloadUrl (the full film).

Related MCP server: vidtheque

Setup

Requires Node ≥ 20 (≥ 22.18 only to run pnpm test, which runs the .ts files directly). ffmpeg on PATH is only needed for range downloads.

git clone https://github.com/JoaquimCassano/mcp-movingimagearchive.git
cd mcp-movingimagearchive
pnpm install && pnpm build

Claude Code:

claude mcp add --scope user movingimagearchive -- node /absolute/path/to/mcp-movingimagearchive/dist/index.js

Claude Desktop / other clients:

{
  "mcpServers": {
    "movingimagearchive": { "command": "node", "args": ["/absolute/path/to/mcp-movingimagearchive/dist/index.js"] }
  }
}

How it talks to the site

These are the site's own endpoints and page sizes. The MCP tools return smaller pages (see each tool's limit) and paginate with offset/nextOffset.

  • POST /api/search {query, color, aspectRatio, yearMin?, yearMax?, offset} — shot search (24/page)

  • GET /api/clips?color&aspectRatio&offset&yearMin&yearMax — browse shots (100/page)

  • GET /api/sources?sort&direction&offset&limit — gallery (max 100/page)

  • GET /api/clips/<id>/download, GET /api/sources/<slug>/download — redirects to the MP4

  • Source and collection pages have no JSON endpoint; their data is read from the Next.js RSC payload (RSC: 1 header). If the site's markup changes, get_source / get_collection / list_collections are the tools that may break.

Range downloads replicate the site's shift-click feature: the site trims the full film in the browser between the first shot's start and the last shot's end; here ffmpeg does the same, using HTTP range requests so only that part of the film is fetched (a 300 MB excerpt of a 10 GB film needs ~300 MB of disk, not 10 GB).

pnpm test   # offline parser checks

The site's Feedback form is intentionally not exposed: its endpoint only accepts submissions from the website itself.

Available Tools

6 tools
downloadDownload footageA

Save footage to a local MP4 (never overwrites an existing file). Pass exactly one of clipId (a single shot) or sourceSlug (the full film). To get only part of it, add startSeconds and/or endSeconds (relative to that shot or film), or, with sourceSlug, fromShot/toShot (1-based, inclusive, like shift-click on the site). Ranges need ffmpeg on PATH; only that part is fetched and it is re-encoded for frame-accurate cuts. If you only need a link, use the URLs returned by the other tools instead.

NameRequiredDescriptionDefault
clipIdNo
toShotNo
fromShotNo
endSecondsNo
outputPathNoDirectory, or file path ending in an extension like .mp4 (default: /root/Downloads)
sourceSlugNoSource slug or /sources/ URL
startSecondsNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, openWorld=true, destructive=false), the description discloses that existing files are never overwritten, that ranges require ffmpeg on PATH, that only the requested part is fetched, and that cuts are re-encoded for frame accuracy. These are meaningful side-effect and dependency facts an agent could not infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the primary action and non-destructiveness, and every sentence carries information. The middle sentence packing the range-selection logic is dense but still readable; minor loss versus a perfectly chunked version.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no output schema, the description covers selection modes, range semantics, ffmpeg dependency, non-overwrite behavior, and the link alternative. The only parameter not narrated (outputPath) is already documented in the schema, so nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 29%, so the description carries the burden — and it does: it explains the mutually-exclusive clipId/sourceSlug choice (not encoded as oneOf in the schema), that startSeconds/endSeconds are relative to the chosen shot or film, and that fromShot/toShot are 1-based inclusive like shift-click. This adds essential semantics the bare schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource ('Save footage to a local MP4') and explicitly distinguishes the tool from the sibling URL-returning tools ('If you only need a link, use the URLs returned by the other tools instead'). An agent can tell instantly what this does and how it differs from search_clips/list_sources/etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exactly-one-of rule (clipId vs sourceSlug), when to add ranges, when to use fromShot/toShot vs seconds, and when NOT to use the tool at all (use returned URLs if you only need a link). Alternatives and exclusions are both explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_collectionGet collectionB
Read-only

Get the shots in one curated collection, with timing, source film and download links.

NameRequiredDescriptionDefault
slugYesCollection slug from list_collections (e.g. 'cats') or a /collection/ page URL
limitNo
offsetNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context about what the response contains (timing, source film, download links), which helps an agent decide whether this tool suffices before calling download. However, it says nothing about pagination behavior or the volume of shots returned, which matters given the limit/offset parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence that front-loads the action and resource and then enumerates the useful return data. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with no output schema, the description does a fair job describing return content, but it leaves the pagination contract (limit default 24, max 50, offset) entirely undocumented, which is a real gap for a collection that may contain many shots.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%: 'slug' is well-documented in the schema, but 'limit' and 'offset' have no descriptions anywhere. The description does not compensate by explaining pagination defaults, maximums (limit max 50), or how to page through a large collection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Get') and resource ('shots in one curated collection') and previews the returned fields (timing, source film, download links). It implicitly differentiates from list_collections by emphasizing a single collection, but never names the sibling or the routing rule.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the agent can infer it should call this after obtaining a slug. The 'slug' schema entry points back to list_collections, but the description itself offers no when-to-use/when-not guidance or alternatives like get_source or search_clips.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sourceGet film detailsA
Read-only

Get one source film: title, year, running time, synopsis, provenance & rights (original producer, collection, original Internet Archive link), full-film download URL and its shot list with per-shot download URLs.

NameRequiredDescriptionDefault
slugYesSource slug (e.g. 'space-shuttle-a-remarkable-flying-machine-b801653d') or a /sources/ page URL
limitNoMax shots to list (0 = metadata only)
offsetNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds real value by disclosing the composition of the payload, including embedded download URLs and a per-shot list. It stops short of saying what happens with an invalid slug or how the shot list paginates.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence starting with the verb and resource; the field enumeration is long but each item conveys distinct returned data, so nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so thoroughly by listing the returned attributes. Remaining gaps are minor: error behavior for a bad slug and the interaction between limit/offset for the shot list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%: slug and limit are documented in the schema (including '0 = metadata only'), while offset has no description anywhere. The description's mention of the 'shot list with per-shot download URLs' contextualizes the limit parameter but adds no syntax or paging detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one source film') and then enumerates exactly what comes back: title, year, running time, synopsis, provenance/rights, download URL, and shot list. The singular 'one source film' cleanly separates it from list_sources, and the mention of shot lists distinguishes it from search_clips.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: fetch full details for a single known source. There is no explicit when-to-use/when-not, no mention of the metadata-only path (limit=0) as an alternative to a full shot listing, and no direction toward download or search_clips for related needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_collectionsList collectionsA
Read-only

List the archive's curated, themed collections of shots (e.g. Cats, Film Countdowns, Space Flight) with their slugs and shot counts.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuine context beyond that: the scope is the archive's curated/themed set (not arbitrary user buckets) and each entry carries a slug and shot count, which tells an agent what it gets back. It does not state whether this is the complete list or how large the result can be.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with zero waste, front-loading the verb and resource while packing the payload description and examples into the same clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, no-output-schema read tool, the description supplies what the agent most needs: what a 'collection' is here and what fields come back. The only gap is whether the list is exhaustive or bounded, and no sorting/order guarantee is given.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4 and the schema carries nothing to explain. The description's mentions of slugs and shot counts describe the response rather than inputs, which adds mild value but is not required parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (the archive's curated, themed collections of shots) and even names the payload (slugs and shot counts). The enumeration framing, plus concrete examples (Cats, Film Countdowns, Space Flight), makes it unmistakably the browse-all endpoint rather than get_collection or search_clips.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: it takes no parameters, so an agent can infer it is a safe discovery/browse call made before drilling into get_collection or search_clips. The description never says when to use this versus those siblings, nor that it is the prerequisite step for obtaining a collection slug.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sourcesList films (gallery)B
Read-only

List the source films in the archive (the site's Gallery), with archive totals. Each film has a slug for get_source and a full-film download link.

NameRequiredDescriptionDefault
sortNofeatured = curated order, recent = recently added, alpha = by title (direction asc = A–Z)featured
limitNo
offsetNo
directionNodesc

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint and openWorldHint annotations already establish that this is a safe, open-world read operation. The description adds useful context about archive totals, slugs, and full-film download links, but it does not disclose pagination behavior, default/max result sizes, or other behavioral details beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, stating the core listing behavior first and then adding the useful detail about slugs and download links. There is no redundant or wasted language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with no output schema, the description gives a reasonable sense of the returned items and totals. However, with four parameters and only 25% schema description coverage, it is not complete enough regarding pagination and sorting, and it lacks explicit sibling routing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25%, so the description should compensate by explaining the four parameters, but it mentions none of sort, limit, offset, or direction. The schema does describe sort and provide enums, which helps somewhat, but the pagination parameters remain undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: it lists source films in the archive/Gallery and includes archive totals. It also hints at the relationship to get_source by noting each film has a slug, but it does not distinguish itself from all relevant siblings such as search_clips or list_collections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the browse-level operation for source films and that get_source is the follow-up for a specific film. However, it does not explicitly say when to use list_sources instead of search_clips, list_collections, or download, leaving the choice mostly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_clipsSearch shotsA
Read-only

Search the archive for individual shots by a visual description (semantic/CLIP search, e.g. 'red sunset over water', 'crowd at a 1930s world fair'). Leave query empty to browse all shots in archive order. Returns shot timing, source film and direct MP4 links for the shot and the full film. Pass nextOffset back as offset for more.

NameRequiredDescriptionDefault
colorNoall
limitNo
queryNoWhat the footage should show. Empty = browse.
offsetNo
yearMaxNoLatest film year
yearMinNoEarliest film year. Any year bound excludes undated films, except 1890 (min) / 2021+ (max) which mean no bound, as on the site.
aspectRatioNoall

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the description's added value is in disclosing return contents (shot timing, source film, direct MP4 links for shot and full film) and pagination via `nextOffset`. This is useful context beyond the annotations, though it doesn't mention rate limits, result caps, or how semantic relevance ordering behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the core purpose and examples, followed by browsing, return, and pagination notes in a logical order. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by summarizing return shape and the pagination continuation mechanism. It is nearly complete for invocation, with the minor gap of not clarifying filter interactions (e.g., how color/year/aspect filters combine with semantic query).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 43%, so the description carries more burden. It nicely explains `query` semantics (empty = browse) and the `offset`/`nextOffset` pagination contract, but adds nothing about `color`, `limit` (max 50), `aspectRatio`, or the `yearMin` edge-case bounds beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Search the archive for individual shots") and disambiguates the search modality (semantic/CLIP) with two concrete example queries. This clearly distinguishes it from sibling tools like list_sources, get_source, and list_collections, which operate on sources/collections rather than shots.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit usage conditions: leave `query` empty to browse in archive order, and pass `nextOffset` back as `offset` to paginate. It does not name alternative tools or state when to prefer another sibling, so it stops short of full when/when-not routing, but the operational guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observeddownload
    • First observedget_collection
    • First observedget_source
    • First observedlist_collections
    • First observedlist_sources
    • First observedsearch_clips

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct role: search shots, list source films, get one source film, list curated collections, get one collection, and download footage. The download tool explicitly disambiguates itself from URL-returning tools. No two tools overlap in a confusing way.

Naming Consistency4/5

Most names follow a clear verb_noun snake_case pattern: search_clips, list_sources, get_source, list_collections, get_collection. The lone exception is download, which lacks a noun but is still unambiguous. This is mostly consistent with a minor deviation.

Tool Count5/5

Six tools is well-scoped for a moving image archive: search, browse films, inspect a film, browse collections, inspect a collection, and download. Each tool earns its place without redundancy or obvious missing surface area.

Completeness4/5

The surface covers searching clips, browsing and inspecting source films and collections, and downloading clips or full films. Minor gaps exist, such as no dedicated get_clip-by-id tool and no direct collection-level download, but these are workable via search results and existing download options.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Search and license 217,000+ authentic vintage 8mm home movie clips from the 1930s-1980s. 6 tools: text search, clip details, visual similarity, rough-cut timeline builder, rights verification, and instant licensing via x402 USDC payments on Solana and Base. All footage is real archival film restored in 4K, no AI-generated content.
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables search across videos you've watched via transcripts, on-screen text, and frames, citing exact timestamps. Point it at videos, channels, or playlists; it indexes everything locally and answers queries with deep links to the exact second.
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables connecting any MCP client to a cinematography reference library of 5,489 films. Allows searching film frames by look, mood, or craft attributes, and refining through similar-frame discovery.
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to index videos locally once and then browse a compact text map of shots, transcript, silences and visual embeddings, so they can query moments, cut dead air, apply edit scripts, render with ffmpeg and run QA checks without spending tokens on frames. Pixels are only fetched when the agent explicitly peeks at labeled contact sheets.
    9
    MIT