Skip to main content
Glama

Convex MCP server

Official
by get-convex
console.rs3.02 kB
use anyhow::Context; use common::{ errors::{ FrameData, JsError, }, log_lines::LogLevel, }; use super::{ metrics, OpProvider, }; #[convex_macro::v8_op] pub fn op_console_message<'b, P: OpProvider<'b>>( provider: &mut P, level: String, messages: Vec<String>, ) -> anyhow::Result<()> { for message in messages.iter() { tracing::trace!("console message: {:?}", message); metrics::log_log_line(message); } provider.trace(level.parse()?, messages)?; Ok(()) } #[convex_macro::v8_op] pub fn op_console_trace<'b, P: OpProvider<'b>>( provider: &mut P, mut messages: Vec<String>, frame_data: Vec<FrameData>, ) -> anyhow::Result<()> { let js_error = JsError::from_frames("".to_string(), frame_data, None, |s| { provider.lookup_source_map(s) }); messages.push(js_error.to_string()); for message in messages.iter() { tracing::trace!("console trace: {:?}", message); } provider.trace(LogLevel::Log, messages)?; Ok(()) } #[convex_macro::v8_op] pub fn op_console_time_start<'b, P: OpProvider<'b>>( provider: &mut P, label: String, ) -> anyhow::Result<()> { if provider.console_timers()?.contains_key(&label) { provider.trace( LogLevel::Warn, vec![format!("Timer '{label}' already exists")], )?; } else { let timestamp = provider.unix_timestamp_non_deterministic()?; provider.console_timers()?.insert(label, timestamp); }; Ok(()) } #[convex_macro::v8_op] pub fn op_console_time_log<'b, P: OpProvider<'b>>( provider: &mut P, label: String, extra_messages: Vec<String>, ) -> anyhow::Result<()> { let now = provider .unix_timestamp_non_deterministic()? .as_ms_since_epoch()?; match provider.console_timers()?.get(&label) { None => { provider.trace( LogLevel::Warn, vec![format!("Timer '{label}' does not exist")], )?; }, Some(time) => { let duration = now - time.as_ms_since_epoch()?; let mut messages = vec![format!("{label}: {duration}ms")]; messages.extend(extra_messages.into_iter()); provider.trace(LogLevel::Info, messages)?; }, }; Ok(()) } #[convex_macro::v8_op] pub fn op_console_time_end<'b, P: OpProvider<'b>>( provider: &mut P, label: String, ) -> anyhow::Result<()> { match provider.console_timers()?.remove(&label) { None => { provider.trace( LogLevel::Warn, vec![format!("Timer '{label}' does not exist")], )?; }, Some(time) => { let now = provider .unix_timestamp_non_deterministic()? .as_ms_since_epoch()?; let duration = now - time.as_ms_since_epoch()?; provider.trace(LogLevel::Info, vec![format!("{label}: {duration}ms")])?; }, }; Ok(()) }

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