A focused tool for middle school science educators planning NGSS-aligned curriculum. Exposes eight tools including get_standard for lookup by code, search_by_domain to filter Physical Science, Life Science, or Earth and Space standards, and get_3d_components to extract the SEP, DCI, and CCC framework for any standard. The search_standards tool runs full-text queries with relevance scoring across all 55 middle school standards. Also includes find_related_standards to discover connections through shared practices or core ideas, and suggest_unit_standards to build cohesive multi-week units. Ships with an LRU cache that speeds up repeated queries by 60x. Currently covers MS standards only, not K-5 or high school. Install via npm, Smithery, Docker, or direct npx in your MCP config.
Status: ✅ v1.2.2 Published to npm
⚠️ Middle School Standards Only This MCP server provides access to NGSS Middle School (MS) standards only. It does not include Elementary (K-5) or High School (HS) standards.
Model Context Protocol (MCP) server providing programmatic access to Next Generation Science Standards (NGSS) for middle school education.
npx commandcmd /c npx wrapperwsl npx commandSee full release history in CHANGELOG.md
Install via npm:
npm install ngss-mcp
Or with a specific version:
npm install ngss-mcp@1.0.0
Or install globally:
npm install -g ngss-mcp
Prerequisites:
Add to your MCP configuration file:
macOS/Linux:
{
"mcpServers": {
"ngss": {
"command": "npx",
"args": ["-y", "ngss-mcp"]
}
}
}
Windows:
{
"mcpServers": {
"ngss": {
"command": "cmd",
"args": ["/c", "npx", "-y", "ngss-mcp"]
}
}
}
WSL:
{
"mcpServers": {
"ngss": {
"command": "wsl",
"args": ["npx", "-y", "ngss-mcp"]
}
}
}
Install directly from Smithery to use with Claude Desktop or other MCP clients:
npx -y @smithery/cli install @sallvainian/ngss-mcp --client claude
This will automatically configure the server in your Claude Desktop settings.
Run the MCP server in a Docker container for isolated, reproducible deployments.
Using Docker Compose (recommended):
Create a docker-compose.yml file:
version: '3.8'
services:
ngss-mcp:
image: node:18-alpine
working_dir: /app
command: npx -y ngss-mcp
stdin_open: true
tty: true
volumes:
- ngss-data:/root/.npm
volumes:
ngss-data:
Then run:
docker-compose up -d
Using Dockerfile:
Create a Dockerfile:
FROM node:18-alpine
WORKDIR /app
# Install the MCP server globally
RUN npm install -g ngss-mcp
# Expose stdio for MCP protocol
CMD ["ngss-mcp"]
Build and run:
docker build -t ngss-mcp .
docker run -i ngss-mcp
Claude Desktop Configuration for Docker:
{
"mcpServers": {
"ngss": {
"command": "docker",
"args": ["run", "-i", "--rm", "ngss-mcp"]
}
}
}
# Clone repository
git clone <repository-url>
cd NGSS-MCP
# Install dependencies
bun install # or npm install
# Build TypeScript
bun run build # or npm run build
get_standardRetrieve a specific NGSS standard by its code identifier.
Input:
{
"code": "MS-PS1-1"
}
Output:
{
"code": "MS-PS1-1",
"grade_level": "MS",
"domain": "Physical Science",
"topic": "Structure and Properties of Matter",
"performance_expectation": "Develop models to describe the atomic composition of simple molecules and extended structures.",
"sep": {
"code": "SEP-1",
"name": "Develop a model to predict and/or describe phenomena.",
"description": "Science and Engineering Practices Developing and Using Models..."
},
"dci": {
"code": "PS1.A",
"name": "Structure and Properties of Matter",
"description": "Disciplinary Core Ideas..."
},
"ccc": {
"code": "CCC-1",
"name": "Patterns can be used to identify cause and effect relationships.",
"description": "Crosscutting Concepts..."
},
"keywords": ["develop", "model", "describe", "atomic", "composition", "molecules"],
"lesson_scope": {
"key_concepts": [...],
"prerequisite_knowledge": [],
"common_misconceptions": [],
"depth_boundaries": {"include": [], "exclude": []}
}
}
Valid Code Format: MS-(PS|LS|ESS)\d+-\d+
MS-PS1-1 through MS-PS4-3 (Physical Science)MS-LS1-1 through MS-LS4-6 (Life Science)MS-ESS1-1 through MS-ESS3-5 (Earth & Space Science)search_by_domainFind all NGSS standards in a specific science domain.
Input:
{
"domain": "Physical Science"
}
Accepted Values:
"Physical Science" or "physical-science""Life Science" or "life-science""Earth and Space Science" or "earth-space-science"Output:
{
"domain": "Physical Science",
"count": 19,
"standards": [
{
"code": "MS-PS1-1",
"topic": "Structure and Properties of Matter",
"performance_expectation": "Develop models to describe the atomic composition..."
}
]
}
get_3d_componentsExtract the three-dimensional learning components for a specific standard.
Input:
{
"code": "MS-LS2-1"
}
Output:
{
"code": "MS-LS2-1",
"framework_components": {
"Science and Engineering Practices (SEP)": {
"code": "SEP-1",
"name": "Analyze and interpret data to provide evidence...",
"description": "Science and Engineering Practices..."
},
"Disciplinary Core Ideas (DCI)": {
"code": "LS2.A",
"name": "Interdependent Relationships in Ecosystems",
"description": "Disciplinary Core Ideas..."
},
"Crosscutting Concepts (CCC)": {
"code": "CCC-1",
"name": "Patterns can be used to identify cause and effect...",
"description": "Crosscutting Concepts..."
}
}
}
3D Framework Components:
search_standardsPerform full-text search across all NGSS standard content.
Input:
{
"query": "ecosystem interactions",
"domain": "Life Science",
"limit": 5
}
Parameters:
query (required): Search text (min 2 characters)domain (optional): Filter by domainlimit (optional): Maximum results (default: 10, must be positive integer)Output:
{
"query": "ecosystem interactions",
"domain": "Life Science",
"totalMatches": 3,
"results": [
{
"code": "MS-LS2-2",
"domain": "Life Science",
"topic": "Ecosystems: Interactions, Energy, and Dynamics",
"relevance": 0.89,
"performance_expectation": "Construct an explanation that predicts patterns...",
"keywords": ["construct", "explanation", "predicts", "patterns", "interactions"]
}
]
}
Search Scope:
search_by_practiceFilter NGSS standards by Science & Engineering Practices (SEP).
Input:
{
"practice": "Developing and Using Models",
"detail_level": "minimal"
}
Valid SEP Values (10 options):
"Asking Questions and Defining Problems""Developing and Using Models""Planning and Carrying Out Investigations""Analyzing and Interpreting Data""Using Mathematics and Computational Thinking""Constructing Explanations and Designing Solutions""Engaging in Argument from Evidence""Obtaining, Evaluating, and Communicating Information""Define the Criteria and Constraints of a Design Problem""Unknown"Output:
{
"practice": "Developing and Using Models",
"total": 8,
"standards": [
{
"code": "MS-PS1-1",
"topic": "Structure and Properties of Matter",
"performance_expectation": "Develop models to describe..."
}
]
}
search_by_crosscutting_conceptFilter NGSS standards by Crosscutting Concepts (CCC).
Input:
{
"concept": "Patterns",
"detail_level": "minimal"
}
Valid CCC Values (8 options):
"Patterns""Cause and Effect""Scale, Proportion, and Quantity""Systems and System Models""Energy and Matter""Structure and Function""Stability and Change""Unknown"Output:
{
"concept": "Patterns",
"total": 6,
"standards": [
{
"code": "MS-LS2-2",
"topic": "Ecosystems: Interactions, Energy, and Dynamics",
"performance_expectation": "Construct an explanation..."
}
]
}
search_by_disciplinary_core_ideaFilter NGSS standards by Disciplinary Core Ideas (DCI).
Input:
{
"dci": "Definitions of Energy",
"detail_level": "minimal"
}
Valid DCI Values (14 options):
"Definitions of Energy""Earth's Materials and Systems""Evidence of Common Ancestry and Diversity""Forces and Motion""Growth and Development of Organisms""Interdependent Relationships in Ecosystems""Natural Hazards""Organization for Matter and Energy Flow in Organisms""Structure and Function""Structure and Properties of Matter""The History of Planet Earth""The Universe and Its Stars""Wave Properties""Weather and Climate"Output:
{
"dci": "Definitions of Energy",
"total": 4,
"standards": [
{
"code": "MS-PS3-1",
"topic": "Energy",
"performance_expectation": "Construct and interpret graphical displays..."
}
]
}
get_3d_components(Renumbered from Tool 3 - functionality unchanged)
get_unit_suggestionsGet intelligent curriculum unit suggestions based on an anchor standard, using binary compatibility scoring across domain, SEP, CCC, and DCI dimensions.
Input:
{
"anchor_standard": "MS-PS1-1",
"unit_size": 5,
"detail_level": "minimal"
}
Parameters:
anchor_standard (required): Standard code to base suggestions onunit_size (optional): Total standards in unit including anchor (default: 5, range: 2-8)detail_level (optional): Response detail level (minimal/summary/full)Output:
{
"anchor": {
"code": "MS-PS1-1",
"domain": "Physical Science",
"topic": "Structure and Properties of Matter"
},
"unit_size": 5,
"suggestions": [
{
"code": "MS-PS1-2",
"compatibility_score": 8,
"domain_match": true,
"sep_match": true,
"ccc_match": true,
"dci_match": true
}
]
}
Compatibility Scoring (Binary Matching per ADR-001):
Use Cases:
The NGSS-MCP server uses a single-object data model for 3D framework components:
sep object: standard.sep.nameccc object: standard.ccc.namedci object: standard.dci.nameThis ensures consistent data structure and simplifies filtering operations. See docs/adr/001-use-single-object-3d-framework-structure.md for details.
All tools return structured error responses with isError: true:
{
"error": "Not Found",
"message": "Standard MS-PS1-99 does not exist in the database",
"code": "STANDARD_NOT_FOUND"
}
Error Codes:
STANDARD_NOT_FOUND: Requested standard code doesn't existINTERNAL_ERROR: Server error (database not initialized, parsing error, etc.)NGSS-MCP/
├── src/
│ ├── server/
│ │ ├── index.ts # MCP server with 8 tools
│ │ ├── database.ts # Multi-index database with caching
│ │ ├── query-cache.ts # LRU cache with TTL and metrics
│ │ └── query-validation.ts # Input validation and sanitization
│ │ └── integration.test.ts # 87 comprehensive tests (100% coverage)
│ ├── constants/
│ │ └── enum-values.ts # SEP and CCC enum values
│ ├── extraction/ # PDF extraction utilities
│ └── types/
│ └── ngss.ts # Type definitions
├── scripts/
│ ├── test-query-interface.ts # Comprehensive test suite
│ └── test-cache-performance.ts # Cache effectiveness validation
├── data/
│ └── ngss-ms-standards.json # Extracted standards database
├── dist/ # Compiled JavaScript
├── docs/
│ ├── adr/ # Architecture Decision Records
│ │ └── 001-use-single-object-3d-framework-structure.md
│ └── Middle School By Topic NGSS.pdf
# Compile TypeScript
bun run build
# Development mode (watch)
bun run dev
# Extract standards from PDF (requires pdf-extraction MCP)
bun run build-data
# Test PDF extraction
bun test
# Run comprehensive query interface tests (32 tests)
bun run scripts/test-query-interface.ts
# Test cache performance and effectiveness
bun run scripts/test-cache-performance.ts
Test Coverage:
Database Module (database.ts):
Map<string, Standard> - O(1) lookups by standard codeMap<string, Standard[]> - Grouped by science domainMap<string, Set<string>> - Comprehensive searchQuery Cache Module (query-cache.ts):
Query Validation Module (query-validation.ts):
MCP Server (index.ts):
McpServer class from @modelcontextprotocol/sdkMS-(PS|LS|ESS)\d+-\d+MIT
Contributions welcome! Please ensure:
For issues, questions, or feature requests, please open an issue on the repository.
Query Caching:
searchStandards: 64x speedup (0.16ms → 0.002ms)Query Performance:
Performance Metrics API:
getQueryMetrics()getCacheStats()All query methods include comprehensive validation:
Validation Rules:
MS-(PS|LS|ESS)\d+-\d+Validation Errors: Throw descriptive errors with clear messages:
// Invalid standard code
Error: Invalid standard code format. Expected: MS-{PS|LS|ESS}{number}-{number}
// Invalid domain
Error: Invalid domain. Must be one of: Physical Science, Life Science, Earth and Space Science
// Invalid limit
Error: Limit cannot exceed 100
// Empty query
Error: Query must be at least 1 character
Benefits:
io.github.pipeworx-io/brave-search
marcopesani/mcp-server-serper
brave/brave-search-mcp-server
com.mcparmory/google-search-console
acamolese/google-search-console-mcp
io.github.sarahpark/google-search-console