> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stackone.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Jira

> 140 actions available for Jira through StackOne. Use via Actions RPC, Toolset SDK, MCP, or A2A.

export const GettingStarted = ({connector}) => {
  const linkStyle = {
    textDecoration: 'none'
  };
  const authConfigGuides = connector?.authentication?.filter(a => a?.setupGuide) ?? [];
  const linkAccountGuides = connector?.authentication?.filter(a => a?.configGuide) ?? [];
  return <div style={{
    marginTop: '32px',
    paddingTop: '24px',
    borderTop: '1px solid #e2e8f0'
  }}>
      <div style={{
    fontSize: '20px',
    fontWeight: '600',
    marginBottom: '12px'
  }}>Getting Started</div>
      <Steps>
        <Step title="Create or Select a Project">
          Set up a new project or select an existing one. See the <a href="/guides/managing-projects" style={linkStyle}>Projects Guide</a>.
        </Step>
        <Step title="Configure the Connector">
          <>
            Enable the connector and set up auth configuration in your project. See <a href="/guides/explore-connectors" style={linkStyle}>Managing Connectors</a>.
            {authConfigGuides.length > 0 && <>
              <Columns cols={2}>
                {authConfigGuides.map(auth => <Card title="Auth Config" href={`/${auth.setupGuide}`} icon={connector.icon} horizontal>
                    {connector.name} - {auth.label}
                  </Card>)}
              </Columns> 
              </>}
          </>
        </Step>
        <Step title="Link an Account">
          <>
            Connect an account using <a href="/guides/embedding-stackone-hub" style={linkStyle}>StackOne Hub</a> or <a href="/guides/auth-link" style={linkStyle}>Auth Link</a>.
            {linkAccountGuides.length > 0 && <>
                <Columns cols={2}>
                  {linkAccountGuides.map(auth => <Card title="Link Account" href={`/${auth.configGuide}`} icon={connector.icon} horizontal>
                      {connector.name} - {auth.label}
                    </Card>)}
                </Columns>
              </>}
          </>
        </Step>
        <Step title="Use Actions">
          <>
            Invoke actions using one of the methods below:
            <ul style={{
    marginTop: '8px',
    paddingLeft: '20px'
  }}>
              <li style={{
    marginBottom: '4px'
  }}><a href="/mcp/quickstart" style={linkStyle}>MCP</a> – Model Context Protocol for AI assistants</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/a2a/quickstart" style={linkStyle}>A2A</a> – Agent-to-Agent protocol</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/agents/typescript/introduction" style={linkStyle}>AI Toolset (TypeScript)</a> – TypeScript SDK for AI agents</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/agents/python/introduction" style={linkStyle}>AI Toolset (Python)</a> – Python SDK for AI agents</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/platform/api-reference/actions/make-an-rpc-call-to-an-action" style={linkStyle}>Actions RPC</a> – Direct API calls</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/guides/playground" style={linkStyle}>Playground</a> – Test actions in the dashboard</li>
            </ul>
          </>
        </Step>
      </Steps>
    </div>;
};

export const ActionsLibrary = ({search, setSearch, filtered, sharedStyles = {}, KeyCell, ScopesCell, availableScopes, selectedScopes, setSelectedScopes}) => {
  const libraryStyles = {
    section: {
      marginTop: '24px',
      marginBottom: '16px'
    },
    sectionTitle: {
      fontSize: '18px',
      fontWeight: '600',
      marginBottom: '12px'
    },
    filterRow: {
      display: 'flex',
      gap: '12px',
      marginBottom: '12px',
      alignItems: 'stretch'
    },
    count: {
      color: '#64748b',
      fontSize: '12px',
      marginBottom: '8px'
    },
    scopesFilterRow: {
      marginBottom: '12px'
    },
    scopesDropdown: {
      display: 'inline-block',
      fontSize: '12px',
      color: '#475569'
    },
    scopesSummary: {
      cursor: 'pointer',
      padding: '6px 10px',
      borderRadius: '999px',
      border: '1px solid #e2e8f0',
      backgroundColor: '#ffffff',
      listStyle: 'none',
      display: 'inline-flex',
      alignItems: 'center',
      gap: '6px'
    },
    scopesSummaryLabel: {
      margin: 0,
      padding: 0
    },
    scopesChipsContainer: {
      marginTop: '8px',
      padding: '4px 2px 2px',
      display: 'flex',
      flexWrap: 'wrap',
      gap: '6px',
      maxHeight: '90px',
      overflowY: 'auto'
    },
    scopeChip: {
      borderRadius: '999px',
      border: '1px solid #e2e8f0',
      padding: '4px 8px',
      fontSize: '11px',
      backgroundColor: '#f8fafc',
      color: '#475569',
      cursor: 'pointer'
    },
    scopeChipActive: {
      backgroundColor: '#dbeafe',
      borderColor: '#2563eb',
      color: '#1d4ed8'
    },
    tableContainer: {
      maxHeight: '500px',
      overflowY: 'auto',
      overflowX: 'auto',
      border: '1px solid #e2e8f0',
      borderRadius: '8px',
      fontSize: '13px'
    },
    gridTable: {
      display: 'grid',
      minWidth: '600px',
      gridTemplateColumns: '200px 1fr'
    },
    gridTableWithScopes: {
      gridTemplateColumns: '200px 1fr 150px'
    },
    gridHeader: {
      display: 'contents'
    },
    gridHeaderCell: {
      position: 'sticky',
      top: 0,
      backgroundColor: '#f8fafc',
      padding: '10px 12px',
      fontWeight: '600',
      borderBottom: '1px solid #e2e8f0',
      zIndex: 1
    },
    gridRow: {
      display: 'contents'
    },
    gridCellAction: {
      padding: '10px 12px',
      fontWeight: '500',
      borderBottom: '1px solid #f1f5f9'
    },
    gridCellKey: {
      padding: '10px 12px',
      borderBottom: '1px solid #f1f5f9'
    },
    gridCellScopes: {
      padding: '10px 12px',
      borderBottom: '1px solid #f1f5f9',
      color: '#475569',
      fontSize: '12px'
    },
    gridCellDescription: {
      padding: '10px 12px',
      color: '#64748b',
      borderBottom: '1px solid #f1f5f9'
    }
  };
  const styles = {
    ...libraryStyles,
    ...sharedStyles
  };
  const safeAvailableScopes = Array.isArray(availableScopes) ? availableScopes : [];
  const safeSelectedScopes = Array.isArray(selectedScopes) ? selectedScopes : [];
  const hasScopesColumn = safeAvailableScopes.length > 0;
  const hasScopeFilter = safeAvailableScopes.length > 0 && typeof setSelectedScopes === 'function';
  const ScopesCellComponent = ScopesCell || (() => null);
  return <div style={styles.section}>
      <div style={styles.sectionTitle}>Actions</div>
      <div style={styles.filterRow}>
        <SearchBar value={search} onChange={setSearch} placeholder="Search actions" />
        {hasScopeFilter && <FilterDropdown label="Scopes" items={safeAvailableScopes} selectedItems={safeSelectedScopes} onChange={setSelectedScopes} searchPlaceholder="Search scopes..." emptyLabel="No scopes found" />}
      </div>
      <div style={styles.count}>
        {filtered.length === 0 ? '0 actions found' : `${filtered.length} action${filtered.length !== 1 ? 's' : ''}`}
      </div>
      {}
      <div className="not-prose" style={styles.tableContainer}>
        <div style={{
    ...hasScopesColumn ? {
      ...styles.gridTable,
      ...styles.gridTableWithScopes
    } : styles.gridTable
  }}>
          {}
          <div style={styles.gridHeader}>
            <div style={styles.gridHeaderCell}>Action</div>
            <div style={styles.gridHeaderCell}>Description</div>
            {hasScopesColumn && <div style={styles.gridHeaderCell}>Required scopes</div>}
          </div>
          {}
          {filtered.map(a => <div key={a.id} style={styles.gridRow}>
              <div style={styles.gridCellAction}>
                <div>{a.label}</div>
                <div style={{
    marginTop: '4px'
  }}>
                  <KeyCell id={a.id} />
                </div>
              </div>
              <div style={styles.gridCellDescription}>{a.description}</div>
              {hasScopesColumn && <div style={styles.gridCellScopes}>
                  <ScopesCellComponent scopes={a.requiredScopes} actionId={a.id} />
                </div>}
            </div>)}
        </div>
      </div>
    </div>;
};

export const FilterDropdown = ({label, items, selectedItems, onChange, searchPlaceholder = 'Search...', emptyLabel = 'No items found', formatLabel}) => {
  const [dropdownOpen, setDropdownOpen] = React.useState(false);
  const [search, setSearch] = React.useState('');
  const [hoveredItem, setHoveredItem] = React.useState(null);
  const dropdownRef = React.useRef(null);
  const styles = {
    dropdownContainer: {
      position: 'relative'
    },
    dropdownTrigger: {
      display: 'flex',
      alignItems: 'center',
      gap: '8px',
      padding: '10px 14px',
      borderRadius: '8px',
      border: '1px solid #e2e8f0',
      fontSize: '14px',
      backgroundColor: 'white',
      cursor: 'pointer',
      whiteSpace: 'nowrap',
      minWidth: '160px',
      justifyContent: 'space-between'
    },
    dropdownTriggerActive: {
      borderColor: '#068F56',
      backgroundColor: '#f0fdf4'
    },
    dropdownMenu: {
      position: 'absolute',
      top: '100%',
      right: 0,
      marginTop: '4px',
      backgroundColor: 'white',
      border: '1px solid #e2e8f0',
      borderRadius: '8px',
      boxShadow: '0 4px 12px rgba(0,0,0,0.1)',
      zIndex: 50,
      minWidth: '220px',
      maxHeight: '320px',
      display: 'flex',
      flexDirection: 'column'
    },
    dropdownHeader: {
      padding: '8px 12px',
      borderBottom: '1px solid #e2e8f0'
    },
    selectActions: {
      display: 'flex',
      alignItems: 'center',
      gap: '8px',
      marginTop: '6px',
      fontSize: '12px'
    },
    selectActionBtn: {
      background: 'none',
      border: 'none',
      color: '#64748b',
      cursor: 'pointer',
      padding: '2px 4px',
      fontSize: '12px'
    },
    dropdownSearchInput: {
      width: '100%',
      padding: '8px 10px',
      borderRadius: '6px',
      border: '1px solid #e2e8f0',
      fontSize: '13px',
      outline: 'none',
      backgroundColor: '#ffffff'
    },
    dropdownList: {
      overflowY: 'auto',
      maxHeight: '220px',
      padding: '4px 0'
    },
    dropdownItem: {
      display: 'flex',
      alignItems: 'center',
      gap: '10px',
      padding: '8px 12px',
      cursor: 'pointer',
      fontSize: '13px',
      color: '#374151',
      transition: 'background-color 0.1s'
    },
    dropdownItemHover: {
      backgroundColor: '#f8fafc'
    },
    checkbox: {
      width: '16px',
      height: '16px',
      borderRadius: '4px',
      border: '2px solid #d1d5db',
      display: 'flex',
      alignItems: 'center',
      justifyContent: 'center',
      flexShrink: 0
    },
    checkboxChecked: {
      backgroundColor: '#068F56',
      borderColor: '#068F56'
    },
    checkmark: {
      color: 'white',
      fontSize: '10px',
      fontWeight: 'bold'
    },
    dropdownFooter: {
      padding: '8px 12px',
      borderTop: '1px solid #e2e8f0',
      display: 'flex',
      justifyContent: 'space-between',
      alignItems: 'center'
    },
    clearButton: {
      fontSize: '12px',
      color: '#64748b',
      cursor: 'pointer',
      padding: '4px 8px',
      borderRadius: '4px',
      border: 'none',
      background: 'none'
    },
    badge: {
      backgroundColor: '#068F56',
      color: 'white',
      fontSize: '11px',
      fontWeight: '600',
      padding: '2px 6px',
      borderRadius: '10px',
      marginLeft: '4px'
    },
    chevron: {
      fontSize: '10px',
      color: '#64748b',
      transition: 'transform 0.15s'
    },
    noResults: {
      padding: '12px',
      textAlign: 'center',
      color: '#64748b',
      fontSize: '13px'
    }
  };
  const safeSelected = Array.isArray(selectedItems) ? selectedItems : [];
  const formatItemLabel = item => {
    if (typeof formatLabel === 'function') {
      return formatLabel(item);
    }
    return item;
  };
  const filteredItems = React.useMemo(() => {
    if (!search) return items;
    const searchLower = search.toLowerCase();
    return items.filter(item => {
      const labelText = formatItemLabel(item);
      return labelText.toLowerCase().includes(searchLower);
    });
  }, [items, search, formatLabel]);
  const isSelected = item => safeSelected.includes(item);
  const toggleItem = item => {
    const next = isSelected(item) ? safeSelected.filter(v => v !== item) : [...safeSelected, item];
    onChange(next);
  };
  const clearFilters = () => {
    onChange([]);
  };
  const selectAll = () => {
    onChange(items);
  };
  React.useEffect(() => {
    const handleClickOutside = e => {
      if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
        setDropdownOpen(false);
        setSearch('');
        setHoveredItem(null);
      }
    };
    document.addEventListener('mousedown', handleClickOutside);
    return () => document.removeEventListener('mousedown', handleClickOutside);
  }, []);
  return <div style={styles.dropdownContainer} ref={dropdownRef}>
      <button type="button" onClick={() => setDropdownOpen(!dropdownOpen)} style={{
    ...styles.dropdownTrigger,
    ...safeSelected.length > 0 ? styles.dropdownTriggerActive : {}
  }}>
        <span>
          {label}
          {safeSelected.length > 0 && <span style={styles.badge}>{safeSelected.length}</span>}
        </span>
        <span style={{
    ...styles.chevron,
    transform: dropdownOpen ? 'rotate(180deg)' : 'rotate(0deg)'
  }}>
          ▼
        </span>
      </button>
      {dropdownOpen && <div style={styles.dropdownMenu}>
          <div style={styles.dropdownHeader}>
            <input type="text" placeholder={searchPlaceholder} value={search} onChange={e => setSearch(e.target.value)} style={styles.dropdownSearchInput} autoFocus />
            <div style={styles.selectActions}>
              <button type="button" onClick={selectAll} style={styles.selectActionBtn} onMouseEnter={e => {
    e.target.style.color = '#1e293b';
  }} onMouseLeave={e => {
    e.target.style.color = '#64748b';
  }}>
                Select all
              </button>
              <span style={{
    color: '#e2e8f0'
  }}>|</span>
              <button type="button" onClick={clearFilters} style={styles.selectActionBtn} onMouseEnter={e => {
    e.target.style.color = '#1e293b';
  }} onMouseLeave={e => {
    e.target.style.color = '#64748b';
  }}>
                Clear
              </button>
            </div>
          </div>
          <div style={styles.dropdownList}>
            {filteredItems.length === 0 ? <div style={styles.noResults}>{emptyLabel}</div> : filteredItems.map(item => <div key={item} onClick={() => toggleItem(item)} onMouseEnter={() => setHoveredItem(item)} onMouseLeave={() => setHoveredItem(null)} style={{
    ...styles.dropdownItem,
    ...hoveredItem === item ? styles.dropdownItemHover : {}
  }}>
                  <div style={{
    ...styles.checkbox,
    ...isSelected(item) ? styles.checkboxChecked : {}
  }}>
                    {isSelected(item) && <span style={styles.checkmark}>✓</span>}
                  </div>
                  <span>{formatItemLabel(item)}</span>
                </div>)}
          </div>
        </div>}
    </div>;
};

export const SearchBar = ({value, onChange, placeholder = 'Search...'}) => {
  const baseStyle = {
    padding: '10px 14px',
    borderRadius: '8px',
    border: '1px solid #e2e8f0',
    fontSize: '14px',
    outline: 'none',
    backgroundColor: '#fafafa',
    flex: 1,
    minWidth: 0
  };
  return <input type="text" placeholder={placeholder} value={value} onChange={e => onChange(e.target.value)} style={baseStyle} />;
};

export const ConnectorPage = ({connector}) => {
  const styles = {
    header: {
      display: 'flex',
      alignItems: 'center',
      gap: '12px',
      marginBottom: '24px'
    },
    tagsRow: {
      display: 'flex',
      flexWrap: 'wrap',
      gap: '6px',
      marginTop: '8px'
    },
    releaseTag: {
      display: 'inline-block',
      padding: '2px 8px',
      borderRadius: '4px',
      fontSize: '11px',
      fontWeight: '500'
    },
    betaTag: {
      backgroundColor: '#fef3c7',
      color: '#b45309'
    },
    previewTag: {
      backgroundColor: '#E1E9F4',
      color: '#0D58AE',
      border: '1px solid #BFD5F1'
    },
    categoryTag: {
      display: 'inline-block',
      padding: '2px 8px',
      borderRadius: '4px',
      fontSize: '11px',
      fontWeight: '500',
      backgroundColor: '#f1f5f9',
      color: '#475569'
    },
    icon: {
      width: '48px',
      height: '48px',
      borderRadius: '10px',
      backgroundColor: '#f8fafc',
      padding: '2px'
    },
    title: {
      fontSize: '24px',
      fontWeight: '600'
    },
    subtitle: {
      fontSize: '14px',
      color: '#64748b'
    },
    authDescription: {
      fontSize: '14px',
      color: '#64748b',
      marginTop: 0
    },
    sectionTitle: {
      fontSize: '18px',
      fontWeight: '600',
      marginBottom: '12px'
    },
    authList: {
      paddingLeft: '20px',
      color: '#374151'
    },
    codeWrapper: {
      position: 'relative',
      display: 'inline-flex',
      alignItems: 'center',
      maxWidth: '100%',
      cursor: 'pointer',
      overflowX: 'auto',
      overflowY: 'hidden',
      msOverflowStyle: 'none',
      scrollbarWidth: 'none'
    },
    code: {
      backgroundColor: '#f1f5f9',
      padding: '4px 8px',
      borderRadius: '4px',
      fontSize: '11px',
      color: '#475569',
      display: 'inline-block',
      whiteSpace: 'nowrap',
      transition: 'background-color 0.15s'
    },
    codeHover: {
      backgroundColor: '#e2e8f0'
    },
    codeCopied: {
      backgroundColor: '#d1fae5',
      color: '#065f46'
    },
    tooltip: {
      position: 'absolute',
      top: '100%',
      left: '50%',
      transform: 'translateX(-50%)',
      backgroundColor: '#1e293b',
      color: 'white',
      padding: '6px 10px',
      borderRadius: '6px',
      fontSize: '11px',
      whiteSpace: 'nowrap',
      marginTop: '6px',
      zIndex: 50,
      maxWidth: '300px',
      wordBreak: 'break-all'
    },
    tooltipArrow: {
      position: 'absolute',
      bottom: '100%',
      left: '50%',
      transform: 'translateX(-50%)',
      borderWidth: '5px',
      borderStyle: 'solid',
      borderColor: 'transparent transparent #1e293b transparent',
      zIndex: 50
    },
    tdDescription: {
      padding: '10px 12px',
      color: '#64748b',
      verticalAlign: 'top',
      maxWidth: '400px'
    }
  };
  const [search, setSearch] = React.useState('');
  const [copiedId, setCopiedId] = React.useState(null);
  const [selectedScopes, setSelectedScopes] = React.useState([]);
  const availableScopes = React.useMemo(() => {
    const set = new Set();
    connector.actions.forEach(a => {
      if (Array.isArray(a.requiredScopes)) {
        a.requiredScopes.forEach(s => {
          if (s) set.add(s);
        });
      }
    });
    return Array.from(set).sort();
  }, [connector.actions]);
  const filtered = React.useMemo(() => {
    const searchLower = search.toLowerCase();
    return connector.actions.filter(a => {
      const matchesSearch = a.label.toLowerCase().includes(searchLower) || a.description.toLowerCase().includes(searchLower) || a.id.toLowerCase().includes(searchLower);
      if (!matchesSearch) return false;
      if (selectedScopes.length === 0) return true;
      const scopes = Array.isArray(a.requiredScopes) ? a.requiredScopes : [];
      if (scopes.length === 0) return false;
      return selectedScopes.some(scope => scopes.includes(scope));
    });
  }, [connector.actions, search, selectedScopes]);
  const handleImageError = e => {
    e.target.style.display = 'none';
  };
  const formatCategoryLabel = cat => {
    const acronyms = ['ats', 'crm', 'hris', 'iam', 'lms'];
    if (acronyms.includes(cat.toLowerCase())) {
      return cat.toUpperCase();
    }
    return cat.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
  };
  const ReleaseTag = () => {
    if (!connector.releaseStage || connector.releaseStage === 'ga') return null;
    const tagStyle = connector.releaseStage === 'beta' ? {
      ...styles.releaseTag,
      ...styles.betaTag
    } : {
      ...styles.releaseTag,
      ...styles.previewTag
    };
    return <span style={tagStyle}>
        {connector.releaseStage.charAt(0).toUpperCase() + connector.releaseStage.slice(1)}
      </span>;
  };
  const CategoryTags = () => {
    if (!connector.categories || connector.categories.length === 0) return null;
    return <>
        {connector.categories.map(cat => <span key={cat} style={styles.categoryTag}>
            {formatCategoryLabel(cat)}
          </span>)}
      </>;
  };
  const copyToClipboard = async (text, id) => {
    try {
      await navigator.clipboard.writeText(text);
      setCopiedId(id);
      setTimeout(() => setCopiedId(null), 1500);
    } catch (err) {
      console.error('Failed to copy:', err);
    }
  };
  const CopyChip = ({text, copyId}) => {
    const [isHovered, setIsHovered] = React.useState(false);
    const isCopied = copiedId === copyId;
    if (!text) {
      return null;
    }
    const codeStyle = {
      ...styles.code,
      ...isCopied ? styles.codeCopied : isHovered ? styles.codeHover : {}
    };
    return <div style={styles.codeWrapper} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} onClick={() => copyToClipboard(text, copyId)} title="">
        {(isHovered || isCopied) && <div style={styles.tooltip}>
            {isCopied ? '✓ Copied!' : 'Click to copy'}
            <div style={styles.tooltipArrow} />
          </div>}
        <code style={codeStyle}>
          {text}
        </code>
      </div>;
  };
  const KeyCell = ({id}) => <CopyChip text={id} copyId={id} />;
  const ScopesCell = ({scopes, actionId}) => {
    const scopeList = Array.isArray(scopes) ? scopes.filter(Boolean) : [];
    if (scopeList.length === 0) return null;
    return <div style={{
      display: 'flex',
      flexWrap: 'wrap',
      gap: '6px'
    }}>
        {scopeList.map(scope => <CopyChip key={scope} text={scope} copyId={`scopes:${actionId}:${scope}`} />)}
      </div>;
  };
  return <div>
      {}
      <div style={styles.header}>
        <img src={connector.icon} alt={connector.name} style={styles.icon} onError={handleImageError} />
        <div>
          <div style={styles.title}>{connector.name}</div>
          <div style={styles.subtitle}>
            {connector.actions.length} actions · {connector.authentication.length} auth method{connector.authentication.length !== 1 ? 's' : ''}
          </div>
          {connector.releaseStage && connector.releaseStage !== 'ga' || connector.categories && connector.categories.length > 0 ? <div style={styles.tagsRow}>
              <ReleaseTag />
              <CategoryTags />
            </div> : null}
        </div>
      </div>

      {}
      <div style={styles.sectionTitle}>Authentication</div>
      <Columns cols={2}>        
        {connector.authentication.length > 0 ? connector.authentication.map(auth => {
    const authLabel = auth?.label || '';
    const authDescription = auth?.description;
    const configGuide = auth?.configGuide;
    const setupGuide = auth?.setupGuide;
    const hasConfigGuide = !!configGuide;
    const hasSetupGuide = !!setupGuide;
    const hasAnyGuide = hasConfigGuide || hasSetupGuide;
    return <Card key={authLabel} title={authLabel}>
                {authDescription && <p style={{
      ...styles.authDescription,
      marginBottom: hasAnyGuide ? '8px' : 0
    }}>
                    {authDescription}
                  </p>}
                {hasAnyGuide && <span style={{
      fontSize: '14px'
    }}>
                    Guides: {hasSetupGuide && <a href={`/${setupGuide}`} style={{
      textDecoration: 'none'
    }}>Auth Config</a>}
                    {hasConfigGuide && hasSetupGuide && ', '}
                    {hasConfigGuide && <a href={`/${configGuide}`} style={{
      textDecoration: 'none'
    }}>Link Account</a>}
                  </span>}
              </Card>;
  }) : <>
            Contact StackOne for authentication details.
          </>}
      </Columns>

      {connector.documentation?.references?.length > 0 && <>
          <div style={styles.sectionTitle}>References</div>
          <Columns cols={2}>
            {connector.documentation.references.map(ref => {
    let safeHref;
    try {
      const parsed = new URL(ref.url);
      safeHref = parsed.protocol === 'http:' || parsed.protocol === 'https:' ? ref.url : undefined;
    } catch {
      safeHref = undefined;
    }
    return <Card key={`${ref.title}-${ref.url}`} title={ref.title} href={safeHref}>
                  {ref.description}
                </Card>;
  })}
          </Columns>
        </>}

      <ActionsLibrary search={search} setSearch={setSearch} filtered={filtered} sharedStyles={{
    sectionTitle: styles.sectionTitle
  }} KeyCell={KeyCell} ScopesCell={ScopesCell} availableScopes={availableScopes} selectedScopes={selectedScopes} setSelectedScopes={setSelectedScopes} />

      <GettingStarted connector={connector} />

    </div>;
};

export const connector = {
  "key": "jira",
  "name": "Jira",
  "icon": "https://stackone-logos.com/api/jira/filled/png",
  "authentication": [{
    "label": "OAuth 2.0",
    "description": "Requires registering an OAuth app in the Atlassian Developer Console. Supports granular scopes across projects, issues,...",
    "configGuide": "connectors/jira/guides/link-account/oauth-2-0",
    "setupGuide": "connectors/jira/guides/auth-config/oauth-2-0"
  }, {
    "label": "API Key",
    "description": "Best for personal scripts and single-user automation. Uses email + API token for basic authentication.",
    "configGuide": "connectors/jira/guides/link-account/api-key",
    "setupGuide": "connectors/jira/guides/auth-config/api-key"
  }],
  "actions": [{
    "id": "jira_add_attachment",
    "label": "Add Attachment",
    "description": "Add an attachment to an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_get_attachment",
    "label": "Get Attachment",
    "description": "Get metadata for an attachment by ID",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_delete_attachment",
    "label": "Delete Attachment",
    "description": "Delete an attachment from an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_get_attachment_metadata",
    "label": "Get Attachment Archive Metadata",
    "description": "Get metadata for archive attachments (ZIP, TAR, etc.)",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_attachment_settings",
    "label": "Get Attachment Settings",
    "description": "Get global attachment settings for the Jira instance",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_all_boards",
    "label": "Get All Boards",
    "description": "Get all boards visible to the user",
    "requiredScopes": ["read:board-scope:jira-software"]
  }, {
    "id": "jira_get_board",
    "label": "Get Board",
    "description": "Get details of a specific board",
    "requiredScopes": ["read:board-scope:jira-software"]
  }, {
    "id": "jira_get_board_issues",
    "label": "Get Board Issues",
    "description": "Get all issues for a board",
    "requiredScopes": ["read:board-scope:jira-software"]
  }, {
    "id": "jira_get_board_backlog",
    "label": "Get Board Backlog",
    "description": "Get all issues in the backlog of a board",
    "requiredScopes": ["read:board-scope:jira-software"]
  }, {
    "id": "jira_get_board_configuration",
    "label": "Get Board Configuration",
    "description": "Get board configuration including columns and status mappings",
    "requiredScopes": ["read:board-scope:jira-software"]
  }, {
    "id": "jira_list_categories",
    "label": "List Project Categories",
    "description": "Get all project categories",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_category",
    "label": "Get Project Category",
    "description": "Get details of a specific project category",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_category",
    "label": "Create Project Category",
    "description": "Create a new project category",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_update_category",
    "label": "Update Project Category",
    "description": "Update an existing project category",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_delete_category",
    "label": "Delete Project Category",
    "description": "Delete a project category",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_get_issue_changelogs",
    "label": "Get Issue Changelogs",
    "description": "Get the changelog history for an issue",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_changelogs_by_ids",
    "label": "Get Changelogs By IDs",
    "description": "Get specific changelog entries for an issue by changelog IDs",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_list_issue_comments",
    "label": "List Issue Comments",
    "description": "Get all comments for an issue",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_issue_comment",
    "label": "Create Issue Comment",
    "description": "Create a comment on an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_get_issue_comment",
    "label": "Get Comment",
    "description": "Get a specific comment on an issue",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_update_issue_comment",
    "label": "Update Comment",
    "description": "Update a comment on an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_issue_comment",
    "label": "Delete Comment",
    "description": "Delete a comment from an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_list_components",
    "label": "List Components",
    "description": "Get all components for specified projects",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_component",
    "label": "Create Component",
    "description": "Create a new component in a project",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_get_component",
    "label": "Get Component",
    "description": "Get details of a specific component",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_update_component",
    "label": "Update Component",
    "description": "Update an existing component",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_delete_component",
    "label": "Delete Component",
    "description": "Delete a component from a project",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_list_dashboards",
    "label": "List Dashboards",
    "description": "Get all dashboards accessible to the user",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_search_dashboards",
    "label": "Search Dashboards",
    "description": "Search for dashboards with advanced filtering",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_dashboard",
    "label": "Get Dashboard",
    "description": "Get details of a specific dashboard",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_dashboard",
    "label": "Create Dashboard",
    "description": "Create a new dashboard",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_update_dashboard",
    "label": "Update Dashboard",
    "description": "Update an existing dashboard",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_dashboard",
    "label": "Delete Dashboard",
    "description": "Delete a dashboard",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_copy_dashboard",
    "label": "Copy Dashboard",
    "description": "Copy an existing dashboard",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_list_fields",
    "label": "List Fields",
    "description": "Get all fields (system and custom) in the Jira instance",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_search_fields",
    "label": "Search Fields",
    "description": "Search for fields with pagination and filtering",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_field_configurations",
    "label": "Get Field Configurations",
    "description": "Get all field configurations",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_list_filters",
    "label": "List Filters",
    "description": "Get all filters accessible to the user",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_filter",
    "label": "Get Filter",
    "description": "Get details of a specific filter",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_filter",
    "label": "Create Filter",
    "description": "Create a new filter (saved search)",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_update_filter",
    "label": "Update Filter",
    "description": "Update an existing filter",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_filter",
    "label": "Delete Filter",
    "description": "Delete a filter",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_set_filter_favourite",
    "label": "Set Filter Favourite",
    "description": "Add a filter to the current user's favourites",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_filter_favourite",
    "label": "Delete Filter Favourite",
    "description": "Remove a filter from the current user's favourites",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_get_favourite_filters",
    "label": "Get Favourite Filters",
    "description": "Get all filters marked as favourites by the current user",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_my_filters",
    "label": "Get My Filters",
    "description": "Get all filters owned by the current user",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_list_groups",
    "label": "List Groups",
    "description": "Get all groups in the Jira instance",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_search_groups",
    "label": "Search Groups",
    "description": "Find groups matching a query for group picker",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_get_group_members",
    "label": "Get Group Members",
    "description": "Get members of a specific group",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_create_group",
    "label": "Create Group",
    "description": "Create a new group",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_delete_group",
    "label": "Delete Group",
    "description": "Delete a group",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_create_group_member",
    "label": "Create Group Member",
    "description": "Create a group member (add user to group)",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_delete_group_member",
    "label": "Delete Group Member",
    "description": "Delete a group member (remove user from group)",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_get_issue_link_types",
    "label": "Get Issue Link Types",
    "description": "Get all available issue link types",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_issue_link_type",
    "label": "Get Issue Link Type",
    "description": "Get details of a specific issue link type",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_issue_link",
    "label": "Create Issue Link",
    "description": "Create a link between two issues",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_get_issue_link",
    "label": "Get Issue Link",
    "description": "Get details of a specific issue link",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_delete_issue_link",
    "label": "Delete Issue Link",
    "description": "Delete an issue link",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_create_issue_link_type",
    "label": "Create Issue Link Type",
    "description": "Create a new issue link type",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_update_issue_link_type",
    "label": "Update Issue Link Type",
    "description": "Update an existing issue link type",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_delete_issue_link_type",
    "label": "Delete Issue Link Type",
    "description": "Delete an issue link type",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_search_issues",
    "label": "Search For Issues Using JQL",
    "description": "Search for issues using the JQL endpoint with nextPageToken pagination",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_issue",
    "label": "Create Issue",
    "description": "Create a new issue in Jira",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_get_issue",
    "label": "Get Issue",
    "description": "Get details of a specific issue by ID or key",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_update_issue",
    "label": "Update Issue",
    "description": "Update an existing issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_issue",
    "label": "Delete Issue",
    "description": "Delete an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_assign_issue",
    "label": "Assign Issue",
    "description": "Assign an issue to a user",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_list_issue_types",
    "label": "List Issue Types",
    "description": "Get all issue types in the Jira instance",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_issue_type",
    "label": "Get Issue Type",
    "description": "Get details of a specific issue type",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_list_labels",
    "label": "List Labels",
    "description": "Get all labels used in the Jira instance",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_my_permissions",
    "label": "Get My Permissions",
    "description": "Get permissions for the current user",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_all_permissions",
    "label": "Get All Permissions",
    "description": "Get all available permission types",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_get_bulk_permissions",
    "label": "Get Bulk Permissions",
    "description": "Get permissions for multiple projects and issues",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_list_priorities",
    "label": "List Priorities",
    "description": "Get all issue priorities with pagination and filtering",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_priority",
    "label": "Get Priority",
    "description": "Get details of a specific priority",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_list_projects",
    "label": "List Projects",
    "description": "Get a paginated list of projects visible to the user",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_project",
    "label": "Get Project",
    "description": "Get details of a specific project",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_project_statuses",
    "label": "Get Project Statuses",
    "description": "Get all valid statuses for a project grouped by issue type",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_project_components",
    "label": "Get Project Components",
    "description": "Get all components for a project",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_project_versions",
    "label": "Get Project Versions",
    "description": "Get all versions for a project",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_project_issue_types",
    "label": "Get Project Issue Types",
    "description": "Get all issue types available for a project",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_project",
    "label": "Create Project",
    "description": "Create a new Jira project",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_update_project",
    "label": "Update Project",
    "description": "Update a project's details",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_delete_project",
    "label": "Delete Project",
    "description": "Delete a project",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_archive_project",
    "label": "Archive Project",
    "description": "Archive a project",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_restore_project",
    "label": "Restore Deleted Project",
    "description": "Restore a deleted project",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_list_project_roles",
    "label": "List Project Roles",
    "description": "Get all project roles",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_get_project_role",
    "label": "Get Project Role",
    "description": "Get a project role by ID",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_create_project_role",
    "label": "Create Project Role",
    "description": "Create a new project role",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_delete_project_role",
    "label": "Delete Project Role",
    "description": "Delete a project role",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_get_project_role_for_project",
    "label": "Get Project Role For Project",
    "description": "Get a project role for a specific project",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_project_role_actor",
    "label": "Create Project Role Actor",
    "description": "Create actors (users or groups) for a project role",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_list_remote_issue_links",
    "label": "List Remote Issue Links",
    "description": "Get all remote links for an issue",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_remote_issue_link",
    "label": "Get Remote Issue Link",
    "description": "Get a specific remote issue link by ID",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_remote_issue_link",
    "label": "Create Remote Issue Link",
    "description": "Create a remote issue link",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_update_remote_issue_link",
    "label": "Update Remote Issue Link",
    "description": "Update a remote issue link by ID",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_remote_issue_link",
    "label": "Delete Remote Issue Link",
    "description": "Delete a remote issue link by ID",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_remote_issue_link_by_global_id",
    "label": "Delete Remote Issue Link By Global ID",
    "description": "Delete a remote issue link by its global ID",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_list_resolutions",
    "label": "List Resolutions",
    "description": "Get all issue resolutions",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_resolution",
    "label": "Get Resolution",
    "description": "Get details of a specific resolution",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_server_info",
    "label": "Get Server Info",
    "description": "Get information about the Jira instance",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_current_user",
    "label": "Get Current User",
    "description": "Get details of the currently authenticated user",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_board_sprints",
    "label": "Get Board Sprints",
    "description": "Get all sprints for a board",
    "requiredScopes": ["read:board-scope:jira-software"]
  }, {
    "id": "jira_get_sprint",
    "label": "Get Sprint",
    "description": "Get details of a specific sprint",
    "requiredScopes": ["read:board-scope:jira-software"]
  }, {
    "id": "jira_create_sprint",
    "label": "Create Sprint",
    "description": "Create a new sprint",
    "requiredScopes": ["write:sprint:jira-software"]
  }, {
    "id": "jira_update_sprint",
    "label": "Partially Update Sprint",
    "description": "Update an existing sprint",
    "requiredScopes": ["write:sprint:jira-software"]
  }, {
    "id": "jira_delete_sprint",
    "label": "Delete Sprint",
    "description": "Delete a sprint",
    "requiredScopes": ["delete:sprint:jira-software"]
  }, {
    "id": "jira_get_sprint_issues",
    "label": "Get Sprint Issues",
    "description": "Get all issues in a sprint",
    "requiredScopes": ["read:sprint:jira-software"]
  }, {
    "id": "jira_move_issues_to_sprint",
    "label": "Move Issues To Sprint",
    "description": "Move issues to a sprint",
    "requiredScopes": ["write:sprint:jira-software"]
  }, {
    "id": "jira_list_statuses",
    "label": "List Statuses",
    "description": "Get all statuses in the Jira instance",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_get_status",
    "label": "Get Status",
    "description": "Get details of a specific status",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_get_issue_transitions",
    "label": "Get Issue Transitions",
    "description": "Get available transitions for an issue",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_transition_issue",
    "label": "Transition Issue",
    "description": "Transition an issue to a different status",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_get_all_users",
    "label": "Get All Users",
    "description": "Get a list of all users (active and inactive)",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_get_user",
    "label": "Get User",
    "description": "Get details of a specific user by account ID",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_get_user_groups",
    "label": "Get User Groups",
    "description": "Get the groups to which a user belongs",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_search_users",
    "label": "Search Users",
    "description": "Search for active users matching a query string",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_search_users_for_picker",
    "label": "Search Users For Picker",
    "description": "Find users for user picker with highlighted query matches",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_search_users_assignable_to_projects",
    "label": "Search Users Assignable To Projects",
    "description": "Find users who can be assigned issues in one or more projects",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_search_users_assignable_to_issues",
    "label": "Search Users Assignable To Issues",
    "description": "Find users who can be assigned to a specific issue",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_search_users_with_permissions",
    "label": "Search Users With Permissions",
    "description": "Find users who have a set of permissions for a project or issue",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_search_users_with_browse_permission",
    "label": "Search Users With Browse Permission",
    "description": "Find users who have permission to browse issues in a project or specific issue",
    "requiredScopes": ["read:jira-user"]
  }, {
    "id": "jira_create_version",
    "label": "Create Version",
    "description": "Create a new project version",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_get_version",
    "label": "Get Version",
    "description": "Get details of a specific version",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_update_version",
    "label": "Update Version",
    "description": "Update an existing version",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_delete_version",
    "label": "Delete Version",
    "description": "Delete a project version",
    "requiredScopes": ["manage:jira-project"]
  }, {
    "id": "jira_list_issue_votes",
    "label": "List Issue Votes",
    "description": "Get vote information for an issue",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_issue_vote",
    "label": "Create Issue Vote",
    "description": "Add a vote to an issue for the current user",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_issue_vote",
    "label": "Delete Issue Vote",
    "description": "Remove a vote from an issue for the current user",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_list_issue_watchers",
    "label": "List Issue Watchers",
    "description": "Get the list of watchers for an issue",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_issue_watcher",
    "label": "Create Issue Watcher",
    "description": "Add a user as a watcher to an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_issue_watcher",
    "label": "Delete Issue Watcher",
    "description": "Remove a user as a watcher from an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_search_workflows",
    "label": "Search Workflows",
    "description": "Search for workflows in Jira",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_list_workflow_schemes",
    "label": "List Workflow Schemes",
    "description": "Get all workflow schemes",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_get_workflow_scheme",
    "label": "Get Workflow Scheme",
    "description": "Get a workflow scheme by ID",
    "requiredScopes": ["manage:jira-configuration"]
  }, {
    "id": "jira_list_issue_worklogs",
    "label": "List Issue Worklogs",
    "description": "Get all worklogs for an issue",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_create_issue_worklog",
    "label": "Create Issue Worklog",
    "description": "Add a worklog entry to an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_get_issue_worklog",
    "label": "Get Issue Worklog",
    "description": "Get a specific worklog entry from an issue",
    "requiredScopes": ["read:jira-work"]
  }, {
    "id": "jira_update_issue_worklog",
    "label": "Update Issue Worklog",
    "description": "Update a worklog entry on an issue",
    "requiredScopes": ["write:jira-work"]
  }, {
    "id": "jira_delete_issue_worklog",
    "label": "Delete Issue Worklog",
    "description": "Delete a worklog entry from an issue",
    "requiredScopes": ["write:jira-work"]
  }],
  "releaseStage": "preview",
  "categories": ["ticketing"],
  "scopeDefinitions": [{
    "name": "read:jira-user",
    "description": "View user information in Jira that the user has access to, including usernames, email addresses, and avatars"
  }, {
    "name": "read:jira-work",
    "description": "Read project and issue data in Jira, including issues, comments, worklogs, attachments, and project information"
  }, {
    "name": "write:jira-work",
    "description": "Create and edit issues, comments, worklogs, and attachments in Jira",
    "includes": ["read:jira-work"]
  }, {
    "name": "manage:jira-project",
    "description": "Create, update, and delete projects and project-level configurations in Jira",
    "includes": ["read:jira-work"]
  }, {
    "name": "manage:jira-configuration",
    "description": "Manage Jira configuration including workflows, screens, fields, and permission schemes",
    "includes": ["read:jira-work"]
  }, {
    "name": "manage:jira-webhook",
    "description": "Create, update, and delete webhooks in Jira"
  }, {
    "name": "read:board-scope:jira-software",
    "description": "Read board and sprint information in Jira Software"
  }, {
    "name": "read:sprint:jira-software",
    "description": "View sprints, sprint-related issues, and associated properties in Jira Software"
  }, {
    "name": "write:sprint:jira-software",
    "description": "Update sprints, reassign issues to sprints, and modify sprint ordering in Jira Software",
    "includes": ["read:sprint:jira-software"]
  }, {
    "name": "delete:sprint:jira-software",
    "description": "Delete sprints and their associated properties in Jira Software"
  }]
};

<ConnectorPage connector={connector} />
