Nordic Financial MCP

io.github.AIDataNordicPublished by GitHub account AIDataNordicv1.1.0Updated Oct 24, 2026

Semantic search over Nordic filings, press releases, macro data and electricity prices.

VerifiedStreamable HTTPWeb executableFinanceKnowledge & MemoryData & Analytics

Overview

AI-generated overview

Remote MCP server for semantic search over Nordic financial filings, press releases, macro data and electricity prices, with company registry lookups and PDF or

What you can do
Search Nordic filings, press releases and macro summaries by company, ticker, country, sector or year, and run multi-section company research in one call with raw grouped results and an AI-synthesized company analysis with citations. Look up official company registration data for Norway, Denmark and Finland, and download a PDF from a URL to extract its text page by page. Fetch today's and tomorrow's hourly day-ahead electricity spot prices for Nordic bidding zones, and check server connectivity.
When to use it
Useful for questions about Nordic listed companies, annual and quarterly reports, exchange announcements, macro conditions or Nordic power prices, and for due-diligence style research where an assistant should gather and cite source excerpts.
Requirements
A remote streamable-HTTP endpoint; no installation, account, API key or environment variable is declared. An MCP-compliant client handles the session handshake automatically; custom clients must complete it. Network access is required, and the endpoint is rate limited per IP.
Before you install
The README mentions planned or paused agent payment protocols (x402 in USDC, Lightning L402, DigiRail) and blockchain nodes; the manifest declares no authentication or payment requirement, but confirm before relying on free access. parse_pdf_to_text downloads whatever URL it is given, so point it only at trusted documents. Search results are chunked excerpts, not full documents.

Installation

In SourceWeft

  1. Open Nordic Financial MCP in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.AIDataNordic%2Fnordic-financial-mcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "nordic-financial": {
      "type": "http",
      "url": "https://mcp.aidatanorge.no/mcp"
    }
  }
}

README

Nordic Financial MCP

[smithery badge] [nordic_financial_mcp MCP server]

A production-grade semantic search server for Nordic financial markets — built for autonomous AI agents. 1,000,000+ vectors across exchange filings, company reports, commodity prices, freight rates, energy data and press releases.

Search: Natural language queries over annual reports, quarterly reports, exchange announcements and macroeconomic summaries — filtered by company, ticker, country, sector or year. Two-stage hybrid retrieval (dense + sparse BM25, fused via RRF) with cross-encoder reranking for high-precision results.

Live endpoint: https://mcp.aidatanorge.no/mcp
Transport: streamable-http
Registry: Smithery · MCP Registry · Glama · mcp.so


Connect

Add to your MCP client config:

json
{  "mcpServers": {    "nordic-financial": {      "type": "streamable-http",      "url": "https://mcp.aidatanorge.no/mcp"    }  }}

Or with Claude Code:

bash
claude mcp add --transport http nordic-financial https://mcp.aidatanorge.no/mcp

Quick Test

Try the live demo in your browser:
👉 https://mcp.aidatanorge.no/demo

No installation, no configuration. Just search for "Equinor dividend", "Swedish policy rate", or "salmon price Q3".


For MCP Client Developers

This server follows the StreamableHTTP MCP transport. A complete handshake is required before calling tools.

Full Handshake Example (Copy-Paste Ready)

bash
# 1. Create session and capture session IDSESSION_ID=$(curl -X GET https://mcp.aidatanorge.no/mcp \  -H "Accept: application/json, text/event-stream" \  -s -i | grep -i "mcp-session-id" | awk '{print $2}' | tr -d '\r')
echo "Session ID: $SESSION_ID"
# 2. Initialize sessioncurl -X POST https://mcp.aidatanorge.no/mcp \  -H "Content-Type: application/json" \  -H "Accept: application/json, text/event-stream" \  -H "mcp-session-id: $SESSION_ID" \  -d '{    "jsonrpc": "2.0",    "id": 1,    "method": "initialize",    "params": {      "protocolVersion": "2024-11-05",      "capabilities": {},      "clientInfo": {"name": "example-client", "version": "1.0"}    }  }'
# 3. Send initialized notificationcurl -X POST https://mcp.aidatanorge.no/mcp \  -H "Content-Type: application/json" \  -H "Accept: application/json, text/event-stream" \  -H "mcp-session-id: $SESSION_ID" \  -d '{"jsonrpc": "2.0", "method": "notifications/initialized"}'
# 4. List available toolscurl -X POST https://mcp.aidatanorge.no/mcp \  -H "Content-Type: application/json" \  -H "Accept: application/json, text/event-stream" \  -H "mcp-session-id: $SESSION_ID" \  -d '{"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}}'
# 5. Perform a searchcurl -X POST https://mcp.aidatanorge.no/mcp \  -H "Content-Type: application/json" \  -H "Accept: application/json, text/event-stream" \  -H "mcp-session-id: $SESSION_ID" \  -d '{    "jsonrpc": "2.0",    "id": 3,    "method": "tools/call",    "params": {      "name": "search_filings",      "arguments": {"query": "Equinor dividend", "limit": 3}    }  }'

Common Issues & Solutions

ErrorCauseSolution
406 Not AcceptableMissing text/event-stream in Accept headerSend: Accept: application/json, text/event-stream
400 Bad Request: Missing session IDNo session establishedFirst GET /mcp, use returned mcp-session-id header
-32602 Invalid request parametersMissing initialize before tools/listComplete steps 1-3 in order

Python Example with MCP SDK

python
from mcp import ClientSessionfrom mcp.client.streamable_http import streamablehttp_client
async with streamablehttp_client("https://mcp.aidatanorge.no/mcp") as transport:    async with ClientSession(*transport) as session:        await session.initialize()        tools = await session.list_tools()        result = await session.call_tool(            "search_filings",            {"query": "Norwegian housing market Q3 2024", "country": "NO"}        )        print(result.content[0].text)

Why This Matters

This handshake is automatic in MCP-compliant clients like Claude Desktop, LangChain, and the MCP Python SDK. If you're building a custom client, following the sequence above ensures compatibility.

The /demo endpoint shows how a browser can perform the same handshake using JavaScript fetch() — view source for a working implementation.


What This Is

AIDataNorge is a full-stack data pipeline and semantic search system that ingests, processes, and indexes financial data from Nordic markets into a vector database optimized for AI agent queries. It exposes data through a Model Context Protocol (MCP) server, making it natively compatible with Claude, LangChain, and other LLM-based agents.

The system is designed with autonomous machine-to-machine consumption in mind, including support for emerging agent payment protocols. The database is updated nightly.


MCP Tools

search_filings

Semantic search over Nordic company filings, press releases and macroeconomic summaries.

python
search_filings(    query="Nordea net interest margin outlook 2025",    report_type="quarterly_report",  # annual_report | quarterly_report | press_release | macro_summary    country="SE",                    # NO | SE | DK | FI    ticker="NDA",                    # optional — filter by company ticker    fiscal_year=2025,                # optional — filter by year    sector="energy",                 # optional — seafood | energy | shipping    limit=10                         # default 5, max 20)# Returns semantically ranked text chunks with rerank_score, hybrid_score, vector_score,# company, ticker, country, fiscal_year, report_type, filing_date and full text.

Search pipeline: Dense embedding (intfloat/e5-large-v2, 1024d) + sparse BM25, fused via Reciprocal Rank Fusion (RRF), reranked by mmarco-mMiniLMv2-L12-H384-v1. Natural language queries in any language are supported.

get_company_info

Look up a company in the official business registry.

python
get_company_info(    identifier="923609016",  # org/CVR/business ID    country="NO"             # NO (Brønnøysund) | DK (CVR) | FI (PRH))# Returns company name, status and registered address.

parse_pdf_to_text

Download a PDF from a URL and extract all text, page by page.

python
parse_pdf_to_text(    pdf_url="https://example.com/annual_report_2024.pdf")# Returns extracted text with page separators.# Useful for reading report attachments not indexed in the main database.

get_current_power_price

Real-time day-ahead electricity spot prices for all Nordic bidding zones.

python
get_current_power_price(    zone="NO1",              # NO1–NO5, SE1–SE4, DK1, DK2, FI    include_tomorrow=False   # fetch tomorrow's prices if available (published ~13:00 CET))# Returns EUR/kWh — current hour price + full hourly breakdown + daily min/max/avg.# Norwegian zones sourced from hvakosterstrommen.no, others directly from ENTSO-E.# Handles both PT60M (hourly) and PT15M (15-min) resolutions.

company_research

Run multiple targeted searches in a single call and get raw results grouped by section. The caller defines all sections and queries and is responsible for synthesizing the output.

python
company_research(    company="Equinor",    sections=[        {"name": "financials", "query": "Equinor revenue EBITDA operating profit 2024", "ticker": "EQNR"},        {"name": "risk",       "query": "Equinor climate regulatory risk stranded assets", "ticker": "EQNR"},        {"name": "macro",      "query": "Brent crude oil price energy sector Norway 2024", "limit": 3},        {"name": "news",       "query": "Equinor press release dividend acquisition 2024", "ticker": "EQNR"}    ])# Returns: {company, generated_at, sections} — one entry per section with ranked text chunks.# All sections are searched in parallel. Up to 8 sections, max 10 results each.# Use ticker on company-specific sections to avoid false positives from documents# that merely mention the company as a customer or competitor.

For a fully orchestrated due diligence report where AI plans the sections and synthesizes the narrative, use Alfred MCP instead.

ping

python
ping(name="world")# Returns: "Hello world! Nordic MCP server is running."

Data Coverage

SourceGeographyContentVolume
XBRL ESEF (filings.xbrl.org)NO/SE/DK/FI/ISAnnual reports, regulated markets, 2020–present~89k vectors
MFN NordicsSE/NO/DK/FIAnnual & quarterly reports, First North companies~116k vectors
Oslo Børs NewswebNOExchange announcements, 2020–present~52k vectors
Nasdaq CopenhagenDKExchange announcements, 2020–present~8k vectors
Nasdaq HelsinkiFIExchange announcements, 2020–present~5k vectors
Nasdaq StockholmSEExchange announcements, 2020–presentin progress
CisionSE/NO/DK/FIPress releases~20k vectors
GlobeNewswireNO/SE/DK/FIPress releases, updated hourly Mon–Fri~500 vectors
ENTSO-ENO/SE/DK/FIDay-ahead electricity prices, all bidding zones~24k vectors
Commodity & freightGlobalOil, gas, metals, shipping rates (BDRY/FRO/ZIM proxies)25 quarters
Macro NorwayNorwayGDP, CPI, rates, housing, salmon, power24 quarters
Macro NordicsSE/DK/FIRates, housing, credit, power72 quarters

Total: 1,000,000+ vectors · Updated nightly


Architecture

Data Sources                 Pipeline                  Serving─────────────────            ─────────────────         ─────────────────XBRL ESEF               →    Python ingest scripts  →  QdrantMFN Nordics             →    + Playwright scraping  →  Vector DatabaseOslo Børs Newsweb       →    + PDF extraction        →  (1,000,000+ vectors)Nasdaq Copenhagen       →    + Chunking              →        ↓Cision / GlobeNewswire  →SSB / Norges Bank       →    + Chunking              →        ↓SSB / Norges Bank       →    + Dense embeddings      →  MCP ServerSCB / DST / stat.fi     →                        →      (e5-large-v2, 1024d)  →  (FastMCP 3.2)                        →    + Sparse BM25            →        ↓                        →    + RRF fusion             →  AI Agents / LLMs

Technical Stack

Data ingestion

  • Python with Playwright for JavaScript-rendered IR pages and MFN feed
  • PyMuPDF (fitz) for PDF text extraction
  • Paragraph-aware chunking (512-token chunks, 100-token overlap)
  • Dense embeddings: intfloat/e5-large-v2 (1024d)
  • Sparse embeddings: Qdrant/bm25 via fastembed

Storage & search

  • Qdrant vector database (self-hosted)
  • Hybrid dense+sparse retrieval with Reciprocal Rank Fusion (RRF)
  • Cross-encoder reranking (mmarco-mMiniLMv2-L12-H384-v1)

Serving

  • FastMCP 3.2 over HTTP (/mcp endpoint)
  • Cloudflare Tunnel — rate limited to 60 req/min per IP
  • Compatible with Claude, LangChain, and any MCP-capable agent

Infrastructure

  • Ubuntu Server 24 LTS, self-hosted
  • 16 GB RAM
  • Automated cron jobs for continuous ingestion
  • Bitcoin full node (LND) for Lightning Network payments
  • DigiByte full node with DigiRail and DigiDollar Oracle node

Agent Payment Infrastructure

The system is built with autonomous agent monetization in mind, supporting three complementary payment protocols:

x402 Micropayments
A pay-per-call variant of the server (mcp_server_x402.py) is implemented using the x402 protocol — the HTTP 402 payment standard for autonomous agents. Agents receive a payment requirement response, pay in USDC on Base, and retry automatically. Currently paused — x402 functionality will be integrated directly into the main server (mcp_server.py) in a future release.

Lightning Network (L402)
Running a full Bitcoin node with LND enables L402 — the HTTP payment protocol for autonomous agents. Agents can discover the API, receive a Lightning invoice, pay in millisatoshis, and get access — all without human intervention. Infrastructure in place, monetization layer in development.

DigiRail / DigiDollar
Also running a DigiByte full node with DigiRail (an agent payment protocol similar to L402) and a DigiDollar Oracle node. DigiDollar is the world's first UTXO-native decentralized stablecoin, implemented directly in DigiByte Core v9.26. The oracle node contributes to the decentralized price feed that maintains DigiDollar's USD peg — 15 of 30 randomly selected oracle nodes must reach consensus every ~25 minutes using Schnorr signatures.

This multi-protocol payment infrastructure (x402/Base + Bitcoin/Lightning + DigiByte/DigiRail) positions AIDataNorge to serve agents operating across different payment ecosystems.


Ingest Pipeline Design

Each data source has a dedicated ingest script with:

  • Idempotent processing via MD5-based point IDs (upsert-safe)
  • processed.txt log to avoid redundant re-fetching
  • nohup + cron scheduling for unattended overnight runs
  • Structured payload per chunk: source, country, ticker, company_name, report_type, published_date, chunk_index, total_chunks

Chunking strategy: paragraphs are accumulated until reaching the 512-token model window. Chunks never split mid-sentence. 100-token overlap ensures context continuity across chunk boundaries.


Cron Schedule

TimeJob
03:17 SundaysXBRL annual reports
06:00 Mon–Friyfinance — stock prices and FX rates
06:15 dailyMFN Nordics — quarterly reports and press releases
06:30 Mon–FriENTSO-E — energy data
07:00 dailyOslo Børs Newsweb — exchange announcements
08:00–18:00 hourly Mon–FriGlobeNewswire — press releases (NO/SE/DK/FI)
09:00 dailyQuery analysis report (email)

Monitoring & Activity

Check server health

bash
# Qdrant responding?curl http://localhost:6333
# Vector countcurl http://localhost:6333/collections/nordic_company_data | python3 -m json.tool

Check MCP server process

bash
ps aux | grep mcp_server.py

Check MCP query activity

bash
# Tail live logtail -f ~/logs/mcp_server.log
# Run full query analysiscd ~/norsk-mcp-server && venv/bin/python3 analyze_queries.py

Check Cloudflare tunnel

bash
journalctl -u cloudflared --since "1 hour ago" | tail -50

Skills Demonstrated

  • RAG system design — end-to-end pipeline from raw data to semantic search
  • Hybrid retrieval — dense+sparse embeddings with RRF fusion and cross-encoder reranking
  • Web scraping at scale — Playwright, RSS feeds, REST APIs, PDF extraction
  • Vector database operations — Qdrant, embedding models, reranking
  • MCP server development — FastMCP, tool design for LLM agents
  • Agent payment protocols — x402, L402, DigiRail
  • Linux server administration — process management, cron, systemd
  • Blockchain infrastructure — Bitcoin full node + LND, DigiByte full node + oracle
  • Python engineering — async pipelines, error handling, idempotent design
  • Financial data domain knowledge — Nordic exchanges, regulatory filings, macro data

Status (May 2026)

  • nordic_company_data: 1,000,000+ vectors — XBRL, MFN, Newsweb, Cision, GlobeNewswire, ENTSO-E, commodity/freight, macro
  • MCP server: live at https://mcp.aidatanorge.no/mcp
  • Published: Smithery · MCP Registry · Glama · mcp.so
  • x402 pay-per-call: implemented, currently paused — will be integrated into main server
  • L402 / DigiRail: infrastructure in place, monetization layer in development
  • Live demo: https://mcp.aidatanorge.no/demo

Source: README.md at commit 60b1e04

Tools

7

ping

Connectivity check that confirms the Nordic MCP server process is responding. Use this at the start of a session to verify the server is reachable before making other calls. Do not use as a proxy for database health — the server can respond while the Qdrant vector database is temporarily unavailable. To confirm data availability, call search_filings directly. Returns: A greeting string: "Hello {name}! Nordic MCP server is running."

Parametersname

get_company_info

Look up a company in the official business registry for Norway, Denmark or Finland. Use this to retrieve authoritative registration data (legal name, status, address) for a known organisation number. Do not use for Sweden (SE) — use search_filings with country='SE' instead, as Bolagsverket integration is not yet available. Do not use to discover tickers or ISIN codes — use search_filings for that. Args: identifier: Organisation/business/CVR number. Format varies by country: NO: 9-digit organisation number, e.g. 923609016 (Equinor) DK: 8-digit CVR number, e.g. 22756214 (Maersk) FI: Business ID with hyphen, e.g. 0112038-9 (Nokia) country: Two-letter country code: 'NO' (default), 'DK', or 'FI'. Returns: Dict with company name, status and registered business address. Returns {'error': '<message>'} if the company is not found, the identifier format is invalid, or the upstream registry API is unavailable.

Parameterscountryidentifierrequired

search_filings

Search the Nordic financial database for company filings, press releases and macroeconomic summaries. Use this as the primary tool for any question about Nordic listed companies, markets or macro conditions. Do not use to retrieve a full document — results are chunked text excerpts; use parse_pdf_to_text for the full original document. Do not use for Swedish company registration data — use get_company_info instead. The database contains ~1 million vectors across four Nordic markets (NO/SE/DK/FI). COMPANY FILINGS Annual reports (XBRL/ESEF) and quarterly reports from ~1 500 listed companies across Oslo Børs, Nasdaq Stockholm, Nasdaq Helsinki, Nasdaq Copenhagen and First North markets. Covers 2020–present. Strong coverage for NO and SE; growing coverage for DK and FI. EXCHANGE ANNOUNCEMENTS & PRESS RELEASES Regulatory filings, exchange announcements and press releases from listed companies in NO, SE, DK and FI. Covers 2020–present. MACROECONOMIC SUMMARIES Quarterly macro summaries covering key indicators per country: Norway (NO): policy rate, FX rates, CPI, house prices, credit growth, electricity price, salmon price, GDP components Sweden (SE): policy rate, house price index, household credit Denmark (DK): policy rate, house price index, household loans, electricity price Finland (FI): house price index, household debt-to-income ratio, electricity price Use report_type='macro_summary' and country='NO'/'SE'/'DK'/'FI' to filter. Use fiscal_year and a quarter reference in your query, e.g. "Norwegian housing market Q1 2024". Args: query: What you are looking for, e.g. 'net interest margin outlook', 'salmon price Q3', 'dividend policy', 'fleet utilization', 'Norwegian housing market 2024 Q1', 'Swedish policy rate inflation 2023' ticker: Optional — filter by company ticker, e.g. 'SALM', 'EQNR', 'NDA' fisc

Parametersfastlimitqueryrequiredsectorsourcetickercountryfiscal_yearreport_typemax_chunk_index

parse_pdf_to_text

Download a PDF from a URL and extract all text content, page by page. Use this to read the full text of a specific document — for example, an annual report PDF linked from a search_filings result. Best combined with search_filings: use search_filings to locate the document, then parse_pdf_to_text for the full text. Do not use for PDFs that are already well-represented in the database — search_filings is faster and returns pre-ranked, relevant excerpts. Not suitable for scanned (image-only) PDFs without embedded text; those pages will be returned as "(no extractable text)". Args: pdf_url: Direct HTTPS URL to the PDF file, e.g. https://example.com/report.pdf. Must be publicly accessible; authentication-protected URLs will fail. Returns: All text from the PDF with "--- Page N ---" separators between pages. Returns an error string if the download fails, the URL does not point to a valid PDF, or the document exceeds the 60-second download timeout.

Parameterspdf_urlrequired

get_current_power_price

Fetch today's hourly day-ahead electricity spot prices for a Nordic bidding zone. Use this for current and near-term (today/tomorrow) price queries. Do not use for historical price analysis — use search_filings with report_type='macro_summary' and a date reference in the query for that purpose. Tomorrow's prices are published by NordPool around 13:00 CET; requests before that time will return "not yet available" for the tomorrow field. All zones return prices in EUR/kWh (NordPool day-ahead, native currency). Norwegian zones (NO1–NO5) use hvakosterstrommen.no; all other zones use ENTSO-E. Args: zone: Bidding zone code. Options: NO1 (East/Oslo), NO2 (Southwest), NO3 (Central/Trondheim), NO4 (North), NO5 (West/Bergen), SE1–SE4, DK1, DK2, FI. include_tomorrow: Set to True to also fetch tomorrow's hourly prices if already published (default False). Returns: Dict containing zone, date, current_hour_utc, current price, and a 'today' summary with min/max/avg and the full hourly list. Includes a 'tomorrow' key if include_tomorrow=True. Returns {'error': '<message>'} if price data is unavailable for the requested zone or date.

Parameterszoneinclude_tomorrow

company_research

Run multiple targeted searches and return raw results grouped by section. The caller defines all sections and queries — this tool does not decide what is relevant. Before calling, reason about which topics and data sources matter for this specific company: financial metrics, risk factors, sector-specific macro drivers (e.g. freight rates for shipping, power prices for aluminium smelters), recent press releases, peer context, etc. Formulate one query per section. Each query is run independently as a full hybrid search (dense + sparse + rerank). Results are raw chunks — the caller is responsible for synthesis. For a fully orchestrated due diligence report (AI-planned sections, synthesized narrative), use the Alfred MCP server instead: alfred.aidatanorge.no/mcp IMPORTANT — use 'ticker' on company-specific sections to avoid false positives. Without a ticker filter, documents that merely mention the company (e.g. as a customer or competitor) can rank above actual filings from that company. Omit 'ticker' only for sections where cross-company results are intentional, such as sector macro context or peer comparisons. Args: company: Company name, used for metadata only (not a filter). sections: Up to 8 sections. Example: [ {"name": "financials", "query": "Equinor revenue EBITDA operating profit 2024", "ticker": "EQNR"}, {"name": "risk", "query": "Equinor climate regulatory risk stranded assets", "ticker": "EQNR"}, {"name": "macro", "query": "Brent crude oil price energy sector Norway 2024", "limit": 3}, {"name": "news", "query": "Equinor press release dividend acquisition 2024", "ticker": "EQNR"} ] Returns: Dict with 'company', 'generated_at', and 'sections' — one entry per requested section with its name and results (same format as search_filings). Sections with no results return an empty list.

Parameterscompanyrequiredsectionsrequired

analyze_company

AI-powered company analysis using semantic search over Nordic financial data. Orchestrates multiple searches internally and returns a synthesized narrative answer with source citations. Covers annual reports, quarterly reports, press releases and macroeconomic context for Nordic listed companies. Use this when you want a synthesized answer rather than raw search chunks. For raw data access, use search_filings or company_research instead. For a full due diligence report with AI-planned sections, use the Alfred MCP server: alfred.aidatanorge.no/mcp Args: company: Company name or ticker question: What you want to know about the company

Parameterscompanyrequiredquestionrequired

Version history

1
  1. v1.1.0LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts