Skip to main content
Glama

Convex MCP server

Official
by get-convex
source_package.rs2.61 kB
use std::collections::BTreeMap; use common::{ components::ComponentId, runtime::Runtime, types::ModuleEnvironment, }; use database::Transaction; use keybroker::Identity; use model::{ config::{ module_loader::ModuleLoader, types::ModuleConfig, }, modules::ModuleModel, source_packages::{ types::SourcePackage, upload_download::download_package, }, }; use runtime::prod::ProdRuntime; use sync_types::CanonicalizedModulePath; use crate::{ test_helpers::ApplicationTestExt, tests::NODE_SOURCE, Application, }; const SOURCE_MAP: &str = "{}"; #[convex_macro::prod_rt_test] async fn test_source_package(rt: ProdRuntime) -> anyhow::Result<()> { let application = Application::new_for_tests(&rt).await?; let path: CanonicalizedModulePath = "b.js".parse()?; let config = ModuleConfig { path: path.clone().into(), source: NODE_SOURCE.into(), source_map: Some(SOURCE_MAP.to_owned()), environment: ModuleEnvironment::Node, }; let mut modules = BTreeMap::new(); modules.insert(path.clone(), Some(config)); let mut tx = application.begin(Identity::system()).await?; let package = assemble_package(&mut tx, application.modules_cache(), modules).await?; let SourcePackage { storage_key, sha256, .. } = application.upload_package(&package, None, None).await?; let result = download_package(application.modules_storage().clone(), storage_key, sha256).await?; assert_eq!(result.len(), 1); assert_eq!(&*result[&path].source, NODE_SOURCE); assert_eq!( result[&path].source_map.as_ref().map(|s| &s[..]), Some(SOURCE_MAP) ); Ok(()) } pub async fn assemble_package<RT: Runtime>( tx: &mut Transaction<RT>, module_loader: &dyn ModuleLoader<RT>, modifications: BTreeMap<CanonicalizedModulePath, Option<ModuleConfig>>, ) -> anyhow::Result<Vec<ModuleConfig>> { let existing_modules = ModuleModel::new(tx) .get_application_modules(ComponentId::test_user(), module_loader) .await?; let mut modules = BTreeMap::new(); for (path, module) in existing_modules { if modifications.contains_key(&path) { continue; } anyhow::ensure!(modules.insert(path, module).is_none()); } for (path, module_edit) in modifications { let module = match module_edit { Some(m) => m, None => continue, }; anyhow::ensure!(modules.insert(path, module).is_none()); } Ok(modules.into_values().collect()) }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/get-convex/convex-backend'

If you have feedback or need assistance with the MCP directory API, please join our Discord server