Skip to content
This repository was archived by the owner on Mar 1, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions .github/workflows/release-npm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,17 +74,17 @@ jobs:
run: |
VERSION=${{ github.event.release.tag_name || github.event.inputs.version }}
FILE="dist/studio-mcp-server-${VERSION}-${{ matrix.target }}.${{ matrix.archive }}"

# Check if release exists, create if not
if ! gh release view "${VERSION}" >/dev/null 2>&1; then
gh release create "${VERSION}" --title "Release ${VERSION}" --notes "Auto-generated release for ${VERSION}"
fi

# Upload or update asset
if gh release view "${VERSION}" --json assets --jq '.assets[].name' | grep -q "studio-mcp-server-${VERSION}-${{ matrix.target }}.${{ matrix.archive }}"; then
gh release delete-asset "${VERSION}" "studio-mcp-server-${VERSION}-${{ matrix.target }}.${{ matrix.archive }}" --yes
fi

gh release upload "${VERSION}" "${FILE}"

publish-npm:
Expand All @@ -107,10 +107,10 @@ jobs:
VERSION=${{ github.event.release.tag_name || github.event.inputs.version }}
# Remove 'v' prefix if present
VERSION=${VERSION#v}

# Update main package version
npm version $VERSION --no-git-tag-version

# Update optionalDependencies to use the same version
jq --arg version "$VERSION" '
.optionalDependencies = {
Expand Down Expand Up @@ -184,18 +184,18 @@ jobs:
VERSION=${{ github.event.release.tag_name || github.event.inputs.version }}
ARCHIVE_EXT=${{ matrix.target == 'x86_64-pc-windows-msvc' && 'zip' || 'tar.gz' }}
ASSET_NAME="studio-mcp-server-${VERSION}-${{ matrix.target }}.${ARCHIVE_EXT}"

# Download the release asset
gh release download "${VERSION}" --pattern "${ASSET_NAME}" --dir ./temp

# Extract the binary
cd temp
if [[ "${ARCHIVE_EXT}" == "zip" ]]; then
unzip "${ASSET_NAME}"
else
tar -xzf "${ASSET_NAME}"
fi

# Move binary to platform package directory
mv "${{ matrix.binary }}" "../studio-mcp-server/platform-packages/${{ matrix.platform }}/"

Expand All @@ -205,7 +205,7 @@ jobs:
VERSION=${{ github.event.release.tag_name || github.event.inputs.version }}
# Remove 'v' prefix if present
VERSION=${VERSION#v}

# Update platform package version
jq --arg version "$VERSION" '.version = $version' package.json > package.json.tmp && mv package.json.tmp package.json

Expand All @@ -216,4 +216,4 @@ jobs:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

- name: Clean up
run: rm -rf temp
run: rm -rf temp
8 changes: 4 additions & 4 deletions .github/workflows/rust-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ jobs:
run: |
# Create a temporary config for testing
./target/release/studio-mcp-server --init test-config.json

# Test MCP Inspector can connect (run for 5 seconds then exit)
timeout 5s npx --yes @modelcontextprotocol/inspector ./target/release/studio-mcp-server test-config.json --stdio || true

# Clean up
rm -f test-config.json
shell: bash
Expand All @@ -96,7 +96,7 @@ jobs:
runs-on: ubuntu-latest
needs: [test]
if: always()

steps:
- name: Check test results
run: |
Expand All @@ -106,4 +106,4 @@ jobs:
else
echo "❌ Tests failed on one or more platforms"
exit 1
fi
fi
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@ packages/

# Test artifacts
tmp/
temp/
temp/
46 changes: 46 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Pre-commit hooks for WindRiver Studio MCP Server
# Install: pip install pre-commit
# Setup: pre-commit install
# Run manually: pre-commit run --all-files

repos:
# Rust-specific checks using local commands
- repo: local
hooks:
- id: cargo-fmt
name: cargo fmt
description: Format Rust code with rustfmt
entry: cargo fmt --all --
language: system
types: [rust]
pass_filenames: false

- id: cargo-clippy
name: cargo clippy
description: Lint Rust code with clippy
entry: cargo clippy --all-targets --all-features -- -D warnings
language: system
types: [rust]
pass_filenames: false

- id: cargo-check
name: cargo check
description: Check Rust code compiles
entry: cargo check --all-targets --all-features
language: system
types: [rust]
pass_filenames: false

# General file checks
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
exclude: '\.md$'
- id: end-of-file-fixer
- id: check-yaml
- id: check-json
- id: check-toml
- id: check-merge-conflict
- id: mixed-line-ending
args: ['--fix=lf']
15 changes: 11 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ members = [
"studio-mcp-shared"
]

[workspace.package]
version = "0.4.0"
edition = "2024"
license = "MIT"
authors = ["PulseEngine Team"]
repository = "https://github.com/pulseengine/studio-mcp"

[workspace.dependencies]
tokio = { version = "1.0", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
Expand All @@ -31,13 +38,13 @@ base64 = "0.22"
regex = "1.0"

# MCP dependencies - using PulseEngine MCP implementation
pulseengine-mcp-server = "0.7.0"
pulseengine-mcp-protocol = "0.7.0"
# pulseengine-mcp-macros = "0.7.0" # Available but requires significant refactoring
pulseengine-mcp-server = "0.11.0"
pulseengine-mcp-protocol = "0.11.0"
# pulseengine-mcp-macros = "0.11.0" # Available but requires significant refactoring
async-trait = "0.1"

[profile.release]
opt-level = 3
lto = true
codegen-units = 1
panic = "abort"
panic = "abort"
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
# WindRiver Studio MCP Server

A production-ready Model Context Protocol (MCP) server providing AI assistants with secure access to WindRiver Studio CLI functionality, focusing on Pipeline Management (PLM) features.
[![GitHub Release](https://img.shields.io/github/v/release/pulseengine/studio-mcp?label=version)](https://github.com/pulseengine/studio-mcp/releases)
[![CI Status](https://img.shields.io/github/actions/workflow/status/pulseengine/studio-mcp/rust-ci.yml?branch=main&label=CI)](https://github.com/pulseengine/studio-mcp/actions)
[![npm version](https://img.shields.io/npm/v/@pulseengine/studio-mcp-server)](https://www.npmjs.com/package/@pulseengine/studio-mcp-server)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)

**Current Version: 0.2.15** - Built with PulseEngine MCP 0.7.0
A production-ready Model Context Protocol (MCP) server providing AI assistants with secure access to WindRiver Studio CLI functionality, focusing on Pipeline Management (PLM) features.

## Features

Expand Down Expand Up @@ -161,10 +164,8 @@ The server works with any MCP-compatible client:

## Development Status

**Current Release: v0.2.15** - Production-ready with PulseEngine MCP 0.7.0

### ✅ Completed Features
- **Core MCP Server**: Full PulseEngine MCP 0.7.0 integration
- **Core MCP Server**: Full PulseEngine MCP integration
- **CLI Management**: Automatic download, version management, and execution
- **Pipeline Management**: Complete PLM resource and tool providers
- **Intelligent Caching**: Multi-layer caching with performance monitoring
Expand Down Expand Up @@ -201,4 +202,4 @@ MIT License - see LICENSE file for details.

- Built with the [PulseEngine MCP framework](https://github.com/pulseengine/mcp)
- Designed for [WindRiver Studio](https://windriver.com) integration
- Implements the [Model Context Protocol](https://modelcontextprotocol.io/)
- Implements the [Model Context Protocol](https://modelcontextprotocol.io/)
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ This directory contains comprehensive documentation for the WindRiver Studio MCP

- [GitHub Issues](https://github.com/pulseengine/studio-mcp/issues) - Bug reports and feature requests
- [Discussions](https://github.com/pulseengine/studio-mcp/discussions) - Community support
- [Examples](../examples/) - Working code samples and integrations
- [Examples](../examples/) - Working code samples and integrations
2 changes: 1 addition & 1 deletion docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -361,4 +361,4 @@ Resources are cached based on data mutability:
- **Semi-dynamic** (10 minutes): Pipeline lists, project information
- **Dynamic** (1 minute): Active runs, live task status

Cache can be bypassed by including `"bypass_cache": true` in tool parameters.
Cache can be bypassed by including `"bypass_cache": true` in tool parameters.
2 changes: 1 addition & 1 deletion docs/best-practices.md
Original file line number Diff line number Diff line change
Expand Up @@ -467,4 +467,4 @@ result = client.call_tool("plm_list_pipelines", {"project": "MyProject"})
7. **Disabling Caching for Performance**
8. **Using Shared Accounts Instead of Service Accounts**
9. **Not Setting Appropriate Timeouts**
10. **Ignoring Memory Limits**
10. **Ignoring Memory Limits**
2 changes: 1 addition & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -249,4 +249,4 @@ See the [examples directory](../examples/) for complete configuration examples:
- [Basic configuration](../examples/basic-config.json)
- [Multi-instance setup](../examples/multi-instance-config.json)
- [Development configuration](../examples/dev-config.json)
- [Production configuration](../examples/prod-config.json)
- [Production configuration](../examples/prod-config.json)
2 changes: 1 addition & 1 deletion docs/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,4 @@ studio-mcp-server --health

## Troubleshooting

See the [troubleshooting guide](troubleshooting.md) for common installation issues.
See the [troubleshooting guide](troubleshooting.md) for common installation issues.
2 changes: 1 addition & 1 deletion docs/troubleshooting.md
Original file line number Diff line number Diff line change
Expand Up @@ -442,4 +442,4 @@ When reporting issues, include:
- **Solution**: `xattr -d com.apple.quarantine /path/to/studio-mcp-server`

3. **Issue**: Linux GLIBC version compatibility
- **Solution**: Build from source or use npm package
- **Solution**: Build from source or use npm package
2 changes: 1 addition & 1 deletion examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,4 @@ Ask Claude to help with these typical Studio operations:
- Check [troubleshooting guide](../docs/troubleshooting.md) for common issues
- Review [configuration reference](../docs/configuration.md) for all options
- Open [GitHub issues](https://github.com/pulseengine/studio-mcp/issues) for bugs
- Use [GitHub discussions](https://github.com/pulseengine/studio-mcp/discussions) for questions
- Use [GitHub discussions](https://github.com/pulseengine/studio-mcp/discussions) for questions
2 changes: 1 addition & 1 deletion examples/basic-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@
"version": "auto",
"auto_update": true
}
}
}
2 changes: 1 addition & 1 deletion examples/claude-desktop.md
Original file line number Diff line number Diff line change
Expand Up @@ -266,4 +266,4 @@ For better performance with frequent queries:
- Explore [workflow examples](pipeline-automation.md)
- Set up [monitoring and alerts](monitoring-setup.md)
- Review [best practices](../docs/best-practices.md)
- Check out [advanced integrations](vscode-integration.md)
- Check out [advanced integrations](vscode-integration.md)
2 changes: 1 addition & 1 deletion examples/dev-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@
"log_level": "debug",
"sensitive_data_filter": true
}
}
}
2 changes: 1 addition & 1 deletion examples/multi-instance-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,4 @@
"log_level": "info",
"sensitive_data_filter": true
}
}
}
2 changes: 1 addition & 1 deletion examples/pipeline-automation.md
Original file line number Diff line number Diff line change
Expand Up @@ -304,4 +304,4 @@ Set up Claude Desktop to work with Slack for team notifications:
1. **Use caching effectively** to reduce API calls
2. **Batch operations** when possible
3. **Implement rate limiting** to avoid overloading Studio
4. **Monitor resource usage** of automation scripts
4. **Monitor resource usage** of automation scripts
2 changes: 1 addition & 1 deletion examples/prod-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@
"log_level": "info",
"sensitive_data_filter": true
}
}
}
12 changes: 6 additions & 6 deletions studio-cli-manager/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
[package]
name = "studio-cli-manager"
version = "0.3.1"
edition = "2021"
version.workspace = true
edition.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
description = "Manager for downloading and updating WindRiver Studio CLI"
license = "MIT"
authors = ["PulseEngine Team"]
repository = "https://github.com/pulseengine/studio-mcp"

[dependencies]
tokio = { workspace = true }
Expand All @@ -30,4 +30,4 @@ studio-mcp-shared = { path = "../studio-mcp-shared" }
[dev-dependencies]
tempfile = "3.8"
mockito = "1.2"
tokio-test = "0.4"
tokio-test = "0.4"
8 changes: 4 additions & 4 deletions studio-cli-manager/src/auth_cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ impl AuthenticatedCliManager {
// Check cache first
{
let cache = self.credentials_cache.read().await;
if let Some(credentials) = cache.get(&cache_key) {
if !credentials.needs_refresh() {
return Ok(credentials.clone());
}
if let Some(credentials) = cache.get(&cache_key)
&& !credentials.needs_refresh()
{
return Ok(credentials.clone());
}
}

Expand Down
2 changes: 1 addition & 1 deletion studio-cli-manager/src/downloader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,8 @@ mod tests {

#[test]
fn test_gzip_decompression() {
use flate2::write::GzEncoder;
use flate2::Compression;
use flate2::write::GzEncoder;

let downloader = CliDownloader::new("https://example.com/cli".to_string());
let original_data = b"test data for compression";
Expand Down
2 changes: 1 addition & 1 deletion studio-cli-manager/src/executor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ impl CliExecutor {
return Err(StudioError::Cli(format!(
"Command timed out after {} seconds",
timeout_duration.as_secs()
)))
)));
}
};

Expand Down
Loading